• C#中访问私有成员


      首先访问一个类的私有成员不是什么好做法。大家都知道私有成员在外部是不能被访问的。一个类中会存在很多私有成员:如私有字段、私有属性、私有方法。对于私有成员造访,可以套用下面这种非常好的方式去解决。

    private string name;public string Name{    get    return name;    }    set    {        name = value;    }}

        但是有时候,源代码是别人的,只提供给你dll。或者你去维护别人的代码,源代码却有丢失。这样的情况或许你想知道私有成员的值,甚至去想直接调用类里面的私有方法。那怎么办呢?在.net中访问私有成员不是很难,这篇文章提供几个简单的方法让你如愿以偿。

        为了让代码用起来优雅,使用扩展方法去实现。

       1、得到私有字段的值:

    public static T GetPrivateField<T>(this object instance, string fieldname){    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;    Type type = instance.GetType();    FieldInfo field = type.GetField(fieldname, flag);    return (T)field.GetValue(instance);}

    2、得到私有属性的值:

    public static T GetPrivateProperty<T>(this object instance, string propertyname){    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;    Type type = instance.GetType();    PropertyInfo field = type.GetProperty(propertyname, flag);    return (T)field.GetValue(instance, null);}

    3、设置私有成员的值:

    public static void SetPrivateField(this objectinstance, stringfieldname, objectvalue)

        BindingFlagsflag = BindingFlags.Instance | BindingFlags.NonPublic;
        Typetype = instance.GetType();
        FieldInfofield = type.GetField(fieldname, flag);
        field.SetValue(instance, value);

    4、设置私有属性的值:
    public static void SetPrivateProperty(this objectinstance, stringpropertyname, objectvalue)

        BindingFlagsflag = BindingFlags.Instance | BindingFlags.NonPublic;
        Typetype = instance.GetType();
        PropertyInfofield = type.GetProperty(propertyname, flag);
        field.SetValue(instance, value, null);

    5、调用私有方法:

    public static T CallPrivateMethod<T>(this object instance, string name, params object[] param){    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;    Type type = instance.GetType();    MethodInfo method = type.GetMethod(name, flag);    return (T)method.Invoke(instance, param);}

    测试:

    下面我们使用一个测试类,进行测试。新建一个类库项目,测试的类代码如下:

    public class TestClasspublic TestClass()    {        privatefield1 = 1;        privatefield2 = 99;        PrivateFieldA = "Lo";        PrivateFieldB = "ve";    }    private int privatefield1;    private int privatefield2;      private string PrivateFieldA    {        getset;    }    private string PrivateFieldB    {        getset;    }    private int Add()    {        return privatefield1 + privatefield2;    }    private string Join()    {        return PrivateFieldA + PrivateFieldB;    }}

    将上面类库的dll引入控制台项目中。使用下面代码去使用这个类的私有成员:

    TestClass obj = new TestClass();System.Console.WriteLine("私有字段");System.Console.WriteLine(obj.GetPrivateField<int>("privatefield1"));System.Console.WriteLine(obj.GetPrivateField<int>("privatefield2"));System.Console.WriteLine("私有属性");System.Console.WriteLine(obj.GetPrivateProperty<string>("PrivateFieldA"));System.Console.WriteLine(obj.GetPrivateProperty<string>("PrivateFieldB"));System.Console.WriteLine("私有方法");System.Console.WriteLine(obj.CallPrivateMethod<int>("Add",null));System.Console.WriteLine(obj.CallPrivateMethod<string>("Join"null));System.Console.WriteLine("修改私有属性");obj.SetPrivateProperty("PrivateFieldA""hello");obj.SetPrivateProperty("PrivateFieldB""world");System.Console.WriteLine(obj.CallPrivateMethod<string>("Join"null));System.Console.Read();

    结果如下:

    hhh

    总结:实现对类私有成员的访问。点击下载源码

  • 相关阅读:
    制作openresty的docker镜像 + nginx笔记 调试rewrite和location Nginx 学习笔记
    C# winform在WebBrowser下获取完整的Cookies(包括含HTTPOnly属性的)
    vscode代码切换大小写的教程
    C#中的Guid
    .NET Framework 版本和依赖关系
    将 Excel 数据导入 SQL Server数据库
    sqlserver各版本的介绍对比
    使用 Visual Studio Code 创建并运行 Transact SQL 脚本
    SQL转Linq工具的使用——Linqer 4.6
    对象之间的映射(AutoMapper集成)
  • 原文地址:https://www.cnblogs.com/wwwzzg168/p/3570721.html
Copyright © 2020-2023  润新知