问题描述
在C#/.NET应用程序编程开发中,假如现在一个类,其中包含了不同的方法,有公共方法也有私有方法,需要使用反射根据不同的参数动态调用这个类的不同方法。如果直接使用方法Type.GetMethod()
的一个方法名作为参数的重载,如:
var methodName = "你的方法名";
MethodInfo dynMethod = this.GetType().GetMethod(methodName);
dynMethod.Invoke(this, new object[] { methodParams });
这时,私有方法将不能被调用。
那么,在C#/.NET的应用程序编程开发中,如何使用反射调用类的私有方法呢?
方案一
我们知道,在C#中的Type.GetMethod()
方法提供了6个重载,如果要使用反射调用类型的私有方法,则需要指定BindingFlags
参数,如下:
var methodName = "你的方法名";
MethodInfo dynMethod = this.GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
dynMethod.Invoke(this, new object[] { methodParams });
这样就可以使用反射调用类型的私有方法了。
关于BindingFlags的可用枚举,请参数BindingFlags。
方案二
封装一个通用的使用反射调用类型私有方法的静态扩展方法,如下:
static class AccessExtensions
{
public static object Call(this object o, string methodName, params object[] args)
{
var mi = o.GetType ().GetMethod (methodName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance );
if (mi != null) {
return mi.Invoke (o, args);
}
return null;
}
}
方案三
使用TypeInfo.GetDeclaredMethod()
方法,如下:
obj.GetType().GetTypeInfo().GetDeclaredMethod("MethodName").Invoke(obj, yourArgsHere);
或者,将其中封装成扩展方法,如下:
public static object InvokeMethod<T>(this T obj, string methodName, params object[] args)
{
var type = typeof(T);
var method = type.GetTypeInfo().GetDeclaredMethod(methodName);
return method.Invoke(obj, args);
}
温馨提示:本文标注有(完整示例)的示例代码可以直接粘贴在try.dot.net中运行。
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册