2010-08-04 131 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