如何在Windows Phone中按字符串名称调用方法

时间:2014-10-10 08:31:41

标签: c# windows-phone-8.1


我有一个字符串,其内容是我的WP应用程序中的1个函数的名称。例如,假设我有:

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)

那么如何调用字符串中包含的名称的函数呢?非常感谢你的帮助。

更新
我可以通过将此方法的访问级别更改为public来调用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);

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

如果您的应用是Windows运行时应用,请在thisType上使用GetTypeInfo扩展方法,然后使用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会返回某个类型的所有 public 成员,但根据.NET Reference Source,文档似乎不正确:它调用{{1 {}包含Type.GetMethod的{​​{3}}。

答案 1 :(得分:1)

Silverlight反射有限制:

  

在Silverlight中,您无法使用反射来访问私有类型和成员。如果类型或成员的访问级别阻止您在静态编译的代码中访问它,则无法使用反射动态访问它。 (source

查看LambdaExpressions,因为在这种情况下它可能是一种解决方法。