首页 / C#开发 / 正文

C#/.NET应用程序编程开发中如何使用反射(reflection)调用类的私有方法?

2823 1 发布于: 2019-06-19 读完约需5分钟

问题描述

在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中运行。

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: C#/.NET应用程序编程开发中如何根据一个字典的值获取字典的键名?

下一篇: C#/.NET应用程序编程开发中如何根据一个文件的扩展名获取对应的MIME类型?

本文永久链接码友网 » C#/.NET应用程序编程开发中如何使用反射(reflection)调用类的私有方法?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册