gpt4 book ai didi

c# - 使用反射来指定委托(delegate)的类型(附加到事件)?

转载 作者:行者123 更新时间:2023-11-30 17:17:47 29 4
gpt4 key购买 nike

我实际上想做的是这样的事情(我意识到这不是有效的代码):

// Attach the event.
try
{
EventInfo e = mappings[name];
(e.EventHandlerType) handler = (sender, raw) =>
{
AutoWrapEventArgs args = raw as AutoWrapEventArgs;
func.Call(this, args.GetParameters());
};

e.AddEventHandler(this, handler);
}
...

现在我知道 e.EventHandlerType 总是从 EventHandler 派生。但是,我不能这样做:

    EventHandler<AutoWrapEventArgs> handler = (sender, raw) =>
{
AutoWrapEventArgs args = raw as AutoWrapEventArgs;
func.Call(this, args.GetParameters());
};

e.AddEventHandler(this, handler);

正如 .NET 提示的那样,当调用 AddEventHandler 时,没有适用于从 EventHandler 到 EventHandler 的转换。这是确切的信息:

Object of type 'System.EventHandler`1[IronJS.AutoWrapObject+AutoWrapEventArgs]'
cannot be converted to type
'System.EventHandler`1[Node.net.Modules.Streams.NodeStream+DataEventArgs]'.

我也尝试过使用Invoke来动态使用e.EventHandlerType的构造函数,但是没有办法将委托(delegate)定义传递给Invoke()的参数列表(因为没有从委托(delegate)到对象的转换)。

有什么方法可以使用 reflection解决这个问题?

最佳答案

宾果游戏!诀窍是获取对委托(delegate)类型的构造函数的引用,然后使用以下参数调用它:

  • 委托(delegate)的目标对象(backend.Target)
  • 代理指针(backend.Method.MethodHandle.GetFunctionPointer())

执行此操作的实际代码如下所示(在这种情况下,t 是在继承期间提供给 EventHandler<> 的通用参数):

Type t = e.EventHandler.GetGenericArguments()[0];
Delegate handler = (Delegate)
typeof(EventHandler<>)
.MakeGenericType(t)
.GetConstructors()[0]
.Invoke(new object[]
{
backend.Target,
backend.Method.MethodHandle.GetFunctionPointer()
});

然后您可以像这样使用委托(delegate)来添加事件:

e.AddEventHandler(this, handler);

关于c# - 使用反射来指定委托(delegate)的类型(附加到事件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6234038/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com