如何在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 Phone中通过字符串名称调用方法

如果您的应用程序是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,因为在这种情况下它可能是一种变通方法。