C#中的操作代理

时间:2014-08-11 09:30:14

标签: c# delegates anonymous-types

我在使用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()执行的内容/位置使其变硬。这可能是我不明白的匿名类型吗?

3 个答案:

答案 0 :(得分:3)

aExecuteRazorMethod中执行时,它会将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变量,因此它可以在执行时访问它们。这部分通常称为封闭。