先确认一下:
如果编译时不知道方法的签名,能不能通过动态委托在运行时调用方法?本人感觉是不行的(当然,反射可以,但这里只讨论动态委托)动态委托一般是这样调用的吧
首先
Delegate del=Delegate.CreateDelegate(Type delType,object obj,string methodName)
生成一个委托
然后
del.DynamicInvoke(object[]parameters)
调用方法是这样吧?但只有在编译时知道方法的签名,才能这样写啊
因为这里需要一个Type delType
所以还要事先定义一个委托,例如:
delegate int Del(int a,string b)
然后才能通过typeof(Del)获得其Type对象也就是说,编译时就已经明确了方法的签名
既然如此,动态调用还有什么用呢?至少DynamicInvoke方法是多余的,因为完全可以直接用委托调用啊:
Del del=(Del)Delegate.CreateDelegate(typeof(Del),obj,methodName)
然后del(someInt,someString)就行了如果必须在编译时知道方法的签名,动态委托就显得不够“动态”了
还请指教

解决方案 »

  1.   

    我一般是这样“动态委托”的:
    class Program8
        {
            class User
            {
                string _name;
                public string Name
                {
                    get { return _name; }
                    set { this._name = value; }
                }
            }
            public static void Main()
            {
                User u = new User();
                u.Name = "Lucifer";
                Console.Write(QuickReflection<User>.Get_GetDelegate<string>("Name")(u));
            }
            class QuickReflection<T>
            {
                public static Func<T, R> Get_GetDelegate<R>(string pName)
                {
                    Type t = typeof(T);
                    PropertyInfo p = t.GetProperty(pName);
                    return (Func<T, R>)Delegate.CreateDelegate(typeof(Func<T, R>), p.GetGetMethod());
                }
            }
        }
    你可以用Hashtable把生成的动态委托缓存起来,这样的比反射要快非常多
      

  2.   

    你有兴趣的话可以研究一下卢彦的这篇文章http://www.codeproject.com/KB/cs/FastMethodInvoker.aspx
    配合DynamicMethod你就可以实现更通用的快速反射,因为在真是场景下连字段的类型也是运行时知道的,所以我上面的例子不太实用。但他是基础。
      

  3.   

    动态委托?什么时候新造的名词?
    ms有说过Delegate.CreateDelegate是动态委托吗?
    这个方法的作用是从一个方法创建出一个委托实例(当然要符合签名的才行)
    只不过是增加了一种创建委托实例的方式编译时不知道方法的签名,那你怎么调用?
    如果用object[]传参数,那你可以去看DynamicMethod,这个可以做到
      

  4.   

    可以,直接把Delegate这个抽象类着为参数就行了,
    具体用的时候在用它的静态方法来构造就OK.
      

  5.   

    路西菲尔 正解那个codeproject例子很实在
      

  6.   

    没有“动态委托”这一说法
    楼主需要的是匿名方法(.NET Framework 2.0及其以上)
    在 .NET Framework 1.1 或以前的版本
    确实很难达到楼主所谓的动态委托
    但是在1.1之后的版本中有个匿名方法
    可以很容易的达到动态的效果