2014-10-10 78 views
2


我有一個字符串,其內容在我的WP應用程序中名稱爲1。例如,假設我有:如何通過Windows Phone中的字符串名稱調用方法

string functionName = "button3_Click" 

所以我想打電話到Button3_Click()在我的應用程序。我嘗試了System.Reflection中的GetRuntimeMethod方法,但返回的結果爲null,所以當我使用invoke時,我得到了System.NullReferenceException。我的代碼來調用這個函數是:

System.Type[] types = { typeof(MainPage), typeof(RoutedEventArgs) }; 
string functionName = "button3_Click"; 
System.Type thisType = this.GetType();    
MethodInfo method = thisType.GetRuntimeMethod(functionName, types); 
object[] parameters = {this, null}; 
method.Invoke(this, parameters); 

而且button3_Click的原型爲:

private void button3_Click(object sender, RoutedEventArgs e) 

所以,我怎麼能叫字符串中包含的,其名稱的功能?非常感謝你的幫助。

更新
我可以調用改變這個方法的訪問級別公開到Button3_Click()方法,有沒有什麼辦法把這個方法的訪問級別是私有的,我可以調用這個方法?感謝您的幫助。
最後
我想我應該用這樣的代碼,就可以得到所有方法,甚至它的訪問級別是私有還是公有:

System.Type[] types = { typeof(MainPage), typeof(RoutedEventArgs) }; 
string functionName = "button6_Click"; 
TypeInfo typeinfo = typeof(MainPage).GetTypeInfo(); 
MethodInfo methodinfo = typeinfo.GetDeclaredMethod(functionName); 
object[] parameters = {this, null};    
methodinfo.Invoke(this, parameters); 

謝謝您的幫助。

+1

嘗試在'thisType'上使用['GetTypeInfo'](http://msdn.microsoft.com/en-us/library/system.reflection.introspectionextensions.gettypeinfo)方法,然後使用['TypeInfo.GetMethod' ](http://msdn.microsoft.com/en-us/library/system.reflection.typeinfo.getmethod)與'BindingFlags.Instance | BindingFlags.NonPublic'標誌。 – Alovchin 2014-10-10 09:17:48

+0

@Alovchin:我無法在TypeInfo對象中看到GetMethod。也許我必須使用GetRuntimeMethod,但我需要一種獲取私有方法的方法。 – ThanhNguyen 2014-10-10 09:57:22

+0

感謝您的幫助,我使用GetDeclaredMethod,現在對我來說沒問題。 – ThanhNguyen 2014-10-10 10:07:47

回答

2

如果您的應用程序是一個Windows運行時的應用程序,使用上thisTypeGetTypeInfo擴展方法,然後使用TypeInfo.GetDeclaredMethod方法:

using System.Reflection; 
... 
System.Type thisType = this.GetType(); 
TypeInfo thisTypeInfo = thisType.GetTypeInfo(); 
MethodInfo method = thisTypeInfo.GetDeclaredMethod(functionName); 
object[] parameters = {this, null}; 
method.Invoke(this, parameters); 

它在文檔中表示,GetDeclaredMethod回報類型的所有公共成員,但根據.NET Reference Source,文檔似乎是不正確的:它調用Type.GetMethodflags constant包含BindingFlags.NonPublic

+1

我在可移植類庫中試過GetDeclaredMethod,它只返回公共方法。 – 2016-02-21 21:01:08

1

有Silverlight的反射限制:

在Silverlight中,您不能使用反射來訪問私有類型和成員。如果類型或成員的訪問級別會阻止您在靜態編譯的代碼中訪問它,則不能通過使用反射來動態訪問它。 (source

查看LambdaExpressions,因爲在這種情況下它可能是一種解決方法。

+0

雖然它看起來應用程序是在Windows運行時編寫的。 – Alovchin 2014-10-10 09:36:20

+0

@Alovchin你確定嗎? 'GetMethod()'由於某種原因不可用。 – 2014-10-10 09:44:37

+0

@MadSorcerer據我所知,在Windows運行時應用程序中,'System.Type'類是['Platform :: Type']的投影(http://msdn.microsoft.com/zh-cn/library/hh755828。 aspx)類,因此它不包含.NET的System.Type成員。爲了能夠訪問更多的函數,我們應該在我的答案中調用'GetTypeInfo'方法,並使用'System.Reflection.TypeInfo'對象。 – Alovchin 2014-10-10 09:50:51

相關問題