我在使用C#
中的行动代表时遇到了问题我已经查看了this问题,我理解了那里的示例,但在我编写的代码库中,我使用的方式是“我不会”。得到了。这是使用action delegate的方法:
public static string RenderTemplate<T>(string templatePath, T data)
{
string result = null;
ExecuteRazorMethod(() =>
{
result = Razor.Run(data, templatePath);
});
return result;
}
对ExecuteRazorMethod()的调用将调用以下方法:
private static void ExecuteRazorMethod(Action a)
{
try
{
a();
}
.
.
.//irrelevant code
.
}
我不明白执行()时会发生什么。调用了什么方法?我尝试过调试它,传入方法的值是:Void <RenderTemplate> b__5
我不明白。我需要知道RenderTemplate中两个参数实际发生了什么,但不了解a()
执行的内容/位置使其变硬。这可能是我不明白的匿名类型吗?
答案 0 :(得分:3)
a
在ExecuteRazorMethod
中执行时,它会将a
传递的代理完全执行到ExecuteRazorMethod
。尝试在此代码段中的此行result = Razor.Run(data, templatePath);
处切换断点:
ExecuteRazorMethod(() =>
{
result = Razor.Run(data, templatePath);
});
您将看到,当a
开始执行时,您的断点将会命中。
答案 1 :(得分:2)
该代码将编译成与此类似的东西,我希望现在变得清晰:
[CompilerGenerated]
internal class Closure<T>
{
public string Result {get; private set;}
private readonly string _templatePath;
private readonly T _data;
public Closure(string templatePath, T data)
{
_templatePath = templatePath;
_data = data;
}
public void DelegateMethod()
{
Result = Razor.Run(_data, _templatePath);
}
}
public static string RenderTemplate<T>(string templatePath, T data)
{
Closure<T> closure = new Closure<T>(templatePath, data);
ExecuteRazorMethod(closure);
return closure.Result;
}
private static void ExecuteRazorMethod<T>(Closure<T> closure)
{
try
{
closure.DelegateMethod();
}
.
.
.//irrelevant code
.
}
答案 2 :(得分:2)
编译器实际上是从
创建一个命名方法{ result = Razor.Run(data, templatePath); }
一部分。这是Void <RenderTemplate> b__5
方法。请记住,匿名类型和方法是编译器魔术(如果您愿意,还可以是语法糖),即C#功能,而不是CLR功能。编译器必须将它们转换为CLR理解的东西。
创建委托时,它会捕获数据和templatePath变量,因此它可以在执行时访问它们。这部分通常称为封闭。