这是一节课:
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>
我想在我的UI库中使用这种语法,我知道如何实现它,但我不知道它实际上是如何工作的!
我理解某个地方和某个委托是作为方法内容的参数创建和提供的,但无法找到有关此机制或技术的任何信息。
你能点燃我吗?PS:我会根据我得到的anwser更改标题。
假设当前正确答案:
编译器将下面的aspx代码转换为(理解的符号翻译):
<div id="pleaseHelpMe">
<% OneControlInstance.Content(() => {
ViewPageInstance.Response.Write("Some Mixed Stuff ");
ViewPageInstance.Response.Write(Example);
ViewPageInstance.Response.Write(" Euros");
}).Render() %>
</div>
非常感谢Hogan !!
答案 0 :(得分:1)
() => { %> Some Mixed Stuff <%= Example%> Euros <% }
是代表。
在.NET aspx页面中,%> <%
之外的东西(html东西)在编译aspx页面时会被翻译成output.render(string)
。
所以这和委托代码相同:
() =>
{
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>
答案 1 :(得分:1)
ContentControls有一个ContentProperty field,它本质上是一个委托。您的类通过fluent interface(基本上是Content方法的return this
部分)设置此值 - 这只是一种使开发更容易,本身没有任何超级相关性的方式 - 并且这个委托可以被执行通过Render方法,这是控制生命周期的一部分。
您可能遗漏的一点是您在此标记中提供了代理人action:
<% OneControlInstance.Content(() => { %>
Some Mixed Stuff <%= Example%> Euros
<% }).Render() %>
动作就是内容方法调用中的所有内容,即() => { stuff }
,您可以尝试将其作为匿名函数读取,并在大括号和函数代码之间插入参数。