如何解决使用反射来指定委托的类型附加到事件?
| 我实际上想做的是这样的事情(我意识到这是无效的代码):// 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,handler);
正如.NET抱怨的那样,调用AddEventHandler时,没有从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的构造函数,但是无法将委托定义传递给Invoke()的参数列表(因为没有从委托到对象的转换)。
有没有办法我可以使用反射来解决这个问题?
解决方法
答对了!技巧是获取对委托类型的构造函数的引用,然后使用以下参数调用它:
委托的目标对象(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()
});
然后,您可以将委托用于事件添加,如下所示:
e.AddEventHandler(this,handler);
, 您可以使用Delegate.CreateDelegate
完成以下目标:
public void RegisterHandler(string name)
{
EventInfo e = mappings[name];
EventHandler<AutoWrapEventArgs> handler = (s,raw) =>
{
func.Call(this,raw.GetParameters());
};
e.AddEventHandler(this,Delegate.CreateDelegate(e.EventHandlerType,null,handler.Method));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。