2011-09-26 87 views
2

我正在努力反思,泛型,事件处理程序和代表。我有一个从AsyncCompletedEventArgs派生的类型。我想用这个类型创建一个通用的EventHandler实例,也是一个委托。之后,我想将此事件处理程序添加到事件中。反射,泛型,事件处理程序和代表问题

任何人都可以通过使用反射帮助我创建事件处理程序和委托吗?所有的帮助表示赞赏。

// The type is derived from AsyncCompletedEventArgs 
Type[] typeArgs = { soapServiceInfo.GetEntitiesCompletedEventArgsType }; 
var eventHandlerType = typeof(EventHandler<>); 
var constructed = eventHandlerType.MakeGenericType(typeArgs); 

// getEntitiesCompleted = (sender, arguments) => { } 

// soapServiceInfo.GetEntitiesCompletedEventInfo.AddEventHandler(client, getEntitiesCompleted); 
+1

你想让代表做什么? – SLaks

+0

你能提供AddEventHandler()的签名吗?它是(object,AsyncCompletedEventArgs)还是它(object,T)? –

+0

签名是(object,T)where T:AsyncCompletedEventArgs。 我一直在尝试调用CreateDelegate,但是我从lambda函数获取MethodInfo时遇到了问题。 GetEntitiesCompletedEventInfo是一个EventInfo对象。 – scipbe

回答

1

只能创建在编译时已知类型的lambda表达式。

您试图在运行时创建lambda表达式;要做到这一点,你需要编译一个表达式树。

+0

根据代表应该做什么,也许一个命名的通用方法也可以。 – svick

+0

表达式树与代表在这里有什么关系? -1 – leppie

+0

@leppie:他正在创建一个匿名方法,而不是指向现有的泛型方法。他需要编译一个表达式树来在运行时执行该操作。 – SLaks