【问题标题】:Reflection, generics, eventhandlers and delegates problem反射、泛型、事件处理程序和委托问题
【发布时间】:2011-09-26 11:34:15
【问题描述】:

我在反射、泛型、事件处理程序和委托方面苦苦挣扎。我有一个派生自 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);

【问题讨论】:

  • 你想让代理做什么?
  • 能否提供 AddEventHandler() 的签名?是 (object,AsyncCompletedEventArgs) 还是 (object,T) ?
  • 签名是 (object, T) 其中 T : AsyncCompletedEventArgs。我一直在尝试调用 CreateDelegate,但在从 lambda 函数获取 MethodInfo 时遇到问题。 GetEntitiesCompletedEventInfo 是一个 EventInfo 对象。

标签: c# generics reflection delegates event-handling


【解决方案1】:

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

您正在尝试在运行时创建 lambda 表达式;为此,您需要编译一个表达式树。

【讨论】:

  • 取决于委托应该做什么,也许一个命名的泛型方法也可以工作。
  • 表达式树与这里的委托有什么关系? -1
  • @leppie:他正在创建一个匿名方法,而不是指向现有的泛型方法。他需要在运行时编译一个表达式树来执行此操作。
  • @SLaks:我仍然不明白你为什么要涉及表达式树,除非 OP 想要真正做一些愚蠢的事情,比如在运行时实现“逻辑”。我看不出为什么这个逻辑不能在编译时完成。从示例代码中,我无法理解为什么还要使用反射! :) (类型看起来是静态的并且在编译时已知)
  • @leppie: soapServiceInfo.GetEntitiesCompletedEventArgsType 在编译时未知。除非他已经有一个接受soapServiceInfo.GetEntitiesCompletedEventArgsType 的方法,否则他需要在运行时生成它。
【解决方案2】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多