Свободное контрольное письмо, как Telerik: Понимание перевода угловых скобок - PullRequest
1 голос
/ 08 ноября 2010

Вот фрагмент класса:

public class OneControl
{
    ...

    public OneControl Content(Action value) {
        ContentProperty = value;
        return this;
    }

    public void Render()
    {
        ContentProperty();
    }

    ...
}

Тогда я понял это:

<div id="pleaseHelpMe">
    <% OneControlInstance.Content(() => { %> 
        Some Mixed Stuff <%= Example%> Euros
    <% }).Render() %>
</div>

Я хотел бы использовать этот синтаксис в своей библиотеке пользовательского интерфейса, я знаю,как это реализовать, но я не знаю, КАК это на самом деле работает!

Я понимаю, что где-то и в некоторой степени создается делегат и предоставляется в качестве аргумента метода Content, но не могу найти никакой информации об этомМеханизм или техника.

Можете ли вы просветить меня?

PS: Я изменю название в соответствии с полученным ответом.

Предполагаемый текущий правильный ответ :

Компилятор переводит приведенный ниже код aspx в (символический перевод для понимания):

<div id="pleaseHelpMe">
    <% OneControlInstance.Content(() => {
        ViewPageInstance.Response.Write("Some Mixed Stuff ");
        ViewPageInstance.Response.Write(Example);
        ViewPageInstance.Response.Write(" Euros");
    }).Render() %>
</div>

Большое спасибо Hogan !!

Ответы [ 2 ]

1 голос
/ 08 ноября 2010

ContentControls имеет ContentProperty поле , которое по сути является делегатом.Ваш класс устанавливает это значение с помощью плавного интерфейса (по сути, return this части метода Content) - который является всего лишь способом облегчения разработки, ничего сверхъестественного сам по себе - и этот делегат будет искренневыполняется методом Render, который является частью срока службы элемента управления.

Бит, который вам может не хватать, это то, что вы предоставляете делегату действие в вашей разметке здесь:

<% OneControlInstance.Content(() => { %>   
        Some Mixed Stuff <%= Example%> Euros  
    <% }).Render() %> 

Действие - это все, что находится внутри вызова метода содержимого, то есть () => { stuff }, который вы должны попытаться прочитать как анонимную функцию с аргументами между паренами и кодом функции между фигурными скобками.

1 голос
/ 08 ноября 2010

() => { %> Some Mixed Stuff <%= Example%> Euros <% } является делегатом.

На странице .NET aspx содержимое вне %> <% (HTML-материал) переводится в output.render(string) при компиляции страницы aspx.

Так что это то же самое, что икод делегата:

() => 
{ 
  output.render(" Some Mixed Stuff "); 
  output.render(Example); 
  output.render(" Euros "); 
}

Предыдущие комментарии:

Не уверен, что вы спрашиваете.Action value является делегатом.Из документов:

http://msdn.microsoft.com/en-us/library/018hxwa8.aspx

"Инкапсулирует метод, который имеет один параметр и не возвращает значение."

и

"Вы можете использовать делегат Action(<T>) для передачи метода в качестве параметра без явного объявления пользовательского делегата. "


Если вы хотите, чтобы ваш делегат возвратил значение, вы можете использовать TResult Func<in T, out TResult>

...