2011-10-20 142 views
2

动态创建委托我想创建一个通用委托,但我只知道执行时的类型。从类型名称

这里是我想创建委托:

public delegate void MyDel<T>(T t,string msg); 

这里是我想要实例化和使用委托方法

Type typeSet = set.GetType(); 
MethodInfo method = typeSet.GetMethod("Add");  
Delegate test = Delegate.CreateDelegate(typeof(MyDel<typeSet>, method); 

其中排版是不明我在汇编。 不幸的是,我想要调用的方法不是静态的。

有没有人有任何想法?

在此先感谢

回答

4

您需要创建使用MakeGenericType具体的委托类型:

Type template = typeof(MyDel<>); 
Type specific = template.MakeGenericType(typeSet); 
Delegate test = Delegate.CreateDelegate(specific, method); 

认为这就是你以后......

+0

感谢您的答复,我现在怎么打电话给委托人?像这样:if(test!= null) { MyDel <> myDel =(MyDel <>)test; myDel(“blabla”); } – user1005016

+0

@ user1005016:如果您有参数并且可以合理确定它们没问题,您可以使用'Delegate.InvokeDynamic',但是您不知道委托的编译时类型。 –

+0

我想调用实体框架DbSet实体上的“添加”方法 public delegate void DelegateAddObject (T t,DbSet entity); 输入contextType =(context as Object).GetType(); var set =(contextType.GetProperty(entitySetName))。GetValue(context,null); 类型typeSet = set.GetType(); MethodInfo method = typeSet.GetMethod(“Add”); 类型template = typeof(DelegateAddObject <>); 类型特定= template.MakeGenericType(typeSet); Delegate test = Delegate.CreateDelegate(specific,method); 其中context是我的dataContext。 但我得到以下错误:**错误绑定到目标方法** – user1005016