C#中訪問私人成員

來源:互聯網
上載者:User

    首先我必須承認訪問一個類的私人成員不是什麼好做法。大家也都知道私人成員在外部是不能被訪問的。而一個類中會存在很多私人成員:如私人欄位、私人屬性、私人方法。對於私人成員訪問,可以套用下面這種非常好的方式去解決。

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 object instance, string fieldname, object value)
{
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
    Type type = instance.GetType();
    FieldInfo field = type.GetField(fieldname, flag);
    field.SetValue(instance, value);
}
4、設定私人屬性的值:
public static void SetPrivateProperty(this object instance, string propertyname, object value)
{
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
    Type type = instance.GetType();
    PropertyInfo field = 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 TestClass{    public TestClass()    {        privatefield1 = 1;        privatefield2 = 99;        PrivateFieldA = "Lo";        PrivateFieldB = "ve";    }    private int privatefield1;    private int privatefield2;      private string PrivateFieldA    {        get;        set;    }    private string PrivateFieldB    {        get;        set;    }    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();

結果如下:

總結:實現對類私人成員的訪問。

代碼:http://files.cnblogs.com/zhuqil/AccessPrivateDemo.rar

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.