我对System.Reflection有一个问题,当我调用MethodInfo.Invoke方法时,它为我提供了一个TargetException异常,即:对象与目标不匹配,这里的代码如下:
object[] parms = new object[] { path };
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
Type gameType = null;
foreach (Assembly asm in assemblies)
{
string asmName = asm.GetName().Name;
if (asmName == "Tester")
{
gameType = asm.GetType("Tester.Main");
break;
}
}
var game = Convert.ChangeType(GameInstance, gameType);
Type delegateType = game.GetType().GetEvent("gameVideoLoader").EventHandlerType;
MethodInfo method = delegateType.GetMethod("Invoke");
method.Invoke(game, parms); // Here the exception知道吗?PS:游戏对象被正确分配,所以它不是空的
发布于 2013-10-03 07:00:45
乔恩说的话。
另外,如果您试图进行一些黑客活动(而不是生产级代码),下面是一些实用的建议:查看源代码(或者使用反汇编程序(如Reflector或dotPeek),看看事件是如何被调用的。
Type.GetField检索字段(它将具有与事件相同的名称),然后调用GetValue以获取实际的委托。- If the delegate type is public, cast the value and invoke((MyDelegate)fieldValue)(arg1, arg2...)
-否则,转换为Delegate并使用动态调用方法
((Delegate)fieldValue).DynamicInvoke(new object[] { arg1, arg2 })
发布于 2013-10-03 05:49:30
您正在尝试调用委托的Invoke方法,但在Tester.Main实例上。这是错误的-因为Tester.Main实例不是适当委托的实例。
如果你真的想要引发gameVideoLoader事件,那就不一样了.还有你不应该做的事。事件的目的是允许客户端订阅和取消订阅处理程序-对象本身应该负责引发事件。您可能会找到一个用于实现事件的底层字段,获取该字段的值并调用委托--但我强烈建议您不要这样做。在这一点上,你基本上违背了事件的设计。
https://stackoverflow.com/questions/19151656
复制相似问题