2010-08-04 107 views
3

我需要调用具有2个正常参数和第三个参数(参考参数)的反射的void方法。我见过很多关于这个问题的文章,并且都建议使用GetMethod函数而不是InvokeMember。我已经尝试过InvokeMember,它可以工作,有人可以解释我为什么?调用带反射的参考参数的方法

Class1 myreferenceparam = new Class1(); 
myobject.InvokeMember("MyMethod", BindingFlags.InvokeMethod | BindingFlags.Default, null, myobject, new object[] { myparam1, myparam2, myreferenceparam }); 
Response.Write(myreferenceparam.myfield); 

方法MyMethod编辑Class1的字段myfield。我的代码是否正确或者我是否应该使用GetMethod?

+0

考虑动态。如果您使用的是C#4,则可以将该对象分配给“动态”,并将该方法调用为已知方法。 Ex dynamic d = your-unknown-object; d.MyMethod(参数); – 2010-08-04 09:08:45

回答

0

GetMethod将为您提供方法元数据(MethodInfo),它可用于探索方法并采取适当的操作。例如,如果方法不存在或找不到,则会将MethodInfo的值设为null,并且可以在调用方法的InvokeMemeber之前处理该方法。

InvokeMember顾名思义只会调用参数中指定的方法。如果找不到方法,它会抛出“MissingMethodException”,所以你失去了GetMethod提供的验证位。

+0

但InvokeMethod正确调用传递参数作为参考的方法?因为更改方法调用do似乎反映在通过引用传递的变量中,即使我没有使用GetMethod – Stefano 2010-08-04 12:15:44

+0

您的代码没问题,但您可以通过获取methodinfo并使用方法信息调用Invoke来使用替代方法。这似乎是有趣的文章在msdn上,它显示了这些替代方案的性能方面:http://msdn.microsoft.com/en-us/magazine/cc163759.aspx#S6 – akapoor 2010-08-04 13:42:12

+0

我看到InvokeMember是最慢,所以我应该使用MemberInfo ... – Stefano 2010-08-04 15:11:56