我在使用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:游戏对象被正确分配,所以它不是空的
答案 0 :(得分:1)
您尝试调用委托的 Invoke
方法,但是在Tester.Main
实例上。这是错误的 - 因为Tester.Main
实例不是适当委托的实例。
如果您正在尝试实际提升gameVideoLoader
事件,那么这是另一回事......而且您不应该做的事情。事件的目的是允许客户订阅和取消订阅处理程序 - 对象本身应该负责引发事件。您可能能够找到用于实现事件的基础字段,获取该字段的值并调用该委托 - 但我强烈建议不要这样做。你现在基本上反对事件的设计。
答案 1 :(得分:1)
Jon说的话。
另外,如果你正在尝试做一些黑客攻击(而不是生产级别的代码),这里有一些实用的建议:看看源代码(或使用反汇编程序,如Reflector或dotPeek),看看如何调用事件。
否则,如果事件使用编译器生成的字段,请使用Type.GetField
检索字段(它将与事件名称相同),然后调用GetValue
以获取实际的代表
如果委托类型为public,则转换值并调用
((MyDelegate)fieldValue)(arg1, arg2...)
否则,转换为Delegate
并使用动态调用方法
((Delegate)fieldValue).DynamicInvoke(new object[] { arg1, arg2 })