我有一个字符串,其内容是我的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);
感谢您的帮助。
答案 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
,因为在这种情况下它可能是一种解决方法。