这个还是看msdn吧!如果你不理解什么是后期绑定,最好先查一查这个概念。这是一个比较常用的概念,是说在你不确定一个方法的签名(所有参数类型、返回值)的情况下,写出根据情况灵活调用不同方法签名的方法的代码,这个时候就要用到后期绑定代码。

解决方案 »

  1.   

    补充说明一点Delegate的知识:Delegate其实是一个abstract的类型,其实其子类MulticastDelegate其实也是abstract类型。实际的委托都是MulticastDelegate的子类,也就是说一个委托其实可以包容多个方法,而不是象有些人想象的那样一个委托就是指向一个方法。有些人甚至用c风格的函数指针来类比委托,这就更离谱了。举个最简单的例子:using System;namespace ConsoleApplication1
    {
        class Program
        {
            delegate void Hello();        static void Main(string[] args)
            {
                Hello proc = Test1;
                proc += Test2;
                proc();
                Console.ReadKey();
            }        private static void  Test1()
            {
                Console.WriteLine("Test1");
            }        private static void Test2()
            {
                Console.WriteLine("Test2");
            }
        }
    }
    这里为委托的实例proc就放入了两个方法,这样就可以吧proc当做一个变量传递给需要委托的过程,直接运行proc这个委托就调用了Test1、Test3两个方法。你还可以为这个proc变量放入更多的方法,至少可以放入6万个以上。基于上面的知识,再按照我们常见的写法调用委托(或者触发事件),我们调用它,它会自动去遍历所有方法。如果有返回值,其实它只是返回最后一个方法返回值(这样如果我们需要累积等等处理就无法实现了),并且如果有某个方法异常就会直接抛出异常而不会继续执行后边要执行的方法。其实,Delegate提供了“散列”执行方法的手段,我们可以自己去精细地控制:using System;namespace ConsoleApplication1
    {
        class Program
        {
            delegate void Hello();        static void Main(string[] args)
            {
                Hello proc = Test1;
                proc += Test2;
                //proc();
                var errcount = 0;
                foreach (Hello x in proc.GetInvocationList())
                    try
                    {
                        x();
                    }
                    catch
                    {
                        errcount++;
                    }
                Console.WriteLine("调用所有方法,其中有{0}个异常。", errcount);
                Console.ReadKey();
            }        private static void  Test1()
            {
                Console.WriteLine("Test1");
                throw new Exception("haha");
            }        private static void Test2()
            {
                Console.WriteLine("Test2");
            }
        }
    }
    这里我演示了我们可以自己手动去调用proc中的各个方法,并精细地控制每一个方法。
      

  2.   

    DynamicInvoke动态调用由当前委托所表示的方法。
    它的参数类型是:System.Object[],传递给当前委托所表示的方法的对象数组。
    在调用DynamicInvoke时,它会从内部保证传递的参数与回调方法期望的参数兼容。如果兼容,就调用回调方法;如果不兼容,就会抛出一个ArgumentException异常。