先确认一下:
如果编译时不知道方法的签名,能不能通过动态委托在运行时调用方法?本人感觉是不行的(当然,反射可以,但这里只讨论动态委托)动态委托一般是这样调用的吧
首先
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)就行了如果必须在编译时知道方法的签名,动态委托就显得不够“动态”了
还请指教
如果编译时不知道方法的签名,能不能通过动态委托在运行时调用方法?本人感觉是不行的(当然,反射可以,但这里只讨论动态委托)动态委托一般是这样调用的吧
首先
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)就行了如果必须在编译时知道方法的签名,动态委托就显得不够“动态”了
还请指教
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把生成的动态委托缓存起来,这样的比反射要快非常多
配合DynamicMethod你就可以实现更通用的快速反射,因为在真是场景下连字段的类型也是运行时知道的,所以我上面的例子不太实用。但他是基础。
ms有说过Delegate.CreateDelegate是动态委托吗?
这个方法的作用是从一个方法创建出一个委托实例(当然要符合签名的才行)
只不过是增加了一种创建委托实例的方式编译时不知道方法的签名,那你怎么调用?
如果用object[]传参数,那你可以去看DynamicMethod,这个可以做到
具体用的时候在用它的静态方法来构造就OK.
楼主需要的是匿名方法(.NET Framework 2.0及其以上)
在 .NET Framework 1.1 或以前的版本
确实很难达到楼主所谓的动态委托
但是在1.1之后的版本中有个匿名方法
可以很容易的达到动态的效果