Delegate类中的invoke方法声明在哪里?

时间:2014-08-24 07:29:54

标签: c# visual-studio delegates invoke

我尝试挖掘委托类以声明 Invoke 方法,但我没找到它!它究竟在哪里?!!

要检查此条件,请复制以下代码:

public class Program
{
    public delegate void LogDel(string msg);
    private static void Main(string[] args)
    {
        var logger = new LogDel(Logger);
        var msg = "hi";
        logger.Invoke(msg);
        logger(msg);
    }
    public static void Logger(string logMsg)
    {
        Console.WriteLine(logMsg);
    }
}

1 个答案:

答案 0 :(得分:2)

创建委托时,编译器在编译时生成一个继承自MulticastDelegate的类,向该类添加三个方法:BeginInvokeEndInvokeInvoke。您可以使用 ILSpy 等来轻松查看。

这就是为什么在查看Delegate

时无法看到它的原因

这是MSDN所说的:

  

MulticastDelegate是一个特殊的类。编译器和其他工具可以从这个类派生,但你不能明确地从它派生。 Delegate类也是如此。

     

除了委托类型从MulticastDelegate继承的方法之外,公共语言运行库还提供了两种特殊方法:BeginInvoke和EndInvoke。

     

MulticastDelegate有一个委托链表,称为调用列表,由一个或多个元素组成。调用多播委托时,调用列表中的委托将按它们出现的顺序同步调用。如果在执行列表期间发生错误,则抛出异常