如何在Windows Phone中通过字符串名称调用方法
本文关键字:字符串 调用 方法 Windows Phone | 更新日期: 2023-09-27 18:26:11
我有一个字符串,其内容是我的WP应用程序中1个函数的名称。例如,假设我有:
string functionName = "button3_Click"
所以我想在我的应用程序中调用button_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);
button_Click的原型是:
private void button3_Click(object sender, RoutedEventArgs e)
那么,我该如何调用名称包含在字符串中的函数呢?非常感谢你的帮助。
更新
我可以通过将该方法的访问级别更改为public来调用button_Click()方法,有没有办法保持该方法的访问级别为private,我可以调用该方法?谢谢你的帮助
最后
我认为我应该使用这样的代码,它可以获取所有方法,即使它的访问级别是私有或公共的:
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);
谢谢你的帮助。
如果您的应用程序是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
返回一个类型的所有公共成员,但根据.NET Reference Source的说法,该文档似乎不正确:它使用包含BindingFlags.NonPublic
的flags常量调用Type.GetMethod
。
Silverlight反射有限制:
在Silverlight中,不能使用反射来访问私有类型和成员。如果类型或成员的访问级别会阻止您在静态编译的代码中访问它,那么您就不能通过使用反射来动态访问它。(来源)
查看LambdaExpressions
,因为在这种情况下它可能是一种变通方法。