Click here to Skip to main content
16,017,687 members
Articles / Programming Languages / C#
Tip/Trick

Easiest way to access hierarchy / nonpublic member

Rate me:
Please Sign up or sign in to vote.
0.00/5 (No votes)
15 Oct 2012CPOL 10.9K   30   4  
A tip to access hierarchy / nonpublic member

Introduction

In a task, we need to get the private members of the object, call private property for private or inherited base class function. In order to facilitate this type of operation, we have built a c # extension methods, so that we can be the elegant private field, properties, methods of operation of any object. Download nonpubacess.zip.

Using the code    

This function is very easy to use, you can call directly through smart tips.  Potential naming conflicts and the existing methods of the object in order not to occur, I give these methods a unified increased the AllAccess suffix. In the IDE by entering AllAccess these extension methods. You can open such a consistent way of operating object functions, fields and properties.   

The sample code is as follows:  

C#
private void button1_Click(object sender, EventArgs e)
{
    System.Console.WriteLine(this.Text);
    //userWindowText = "Form1"
    this.SetField_AllAccess("userWindowText", "test");
    var x = this.GetField_AllAccess("userWindowText");
    System.Console.WriteLine(x);
    this.Invoke_AllAccess("Hide");//Hide th
    System.Threading.Thread.Sleep(1000);
    this.Invoke_AllAccess("Show");
    var x2 = "abc".GetProperty_AllAccess("Chars", 1);
    System.Console.WriteLine(x2 + " " + this.GetProperty_AllAccess("Text"));
}

Source code

Directly copy the following source code to your project, to all objects support a private member operation. 

C#
public static class extAllAccess
{
    static System.Collections.Generic.Dictionary<Type, 
      System.Collections.Generic.Dictionary<string, 
      System.Reflection.MemberInfo>> dtsm = new Dictionary<Type, 
      Dictionary<string, System.Reflection.MemberInfo>>();
    static void InitType(Type t, Type tDump)
    {
        if (tDump == null)
        {
            dtsm[t] = new Dictionary<string, System.Reflection.MemberInfo>();
            tDump = t;
        }
        foreach (var mi in tDump.GetMembers(
            System.Reflection.BindingFlags.DeclaredOnly |
            System.Reflection.BindingFlags.Instance |
            System.Reflection.BindingFlags.Static |
            System.Reflection.BindingFlags.NonPublic |
            System.Reflection.BindingFlags.Public))
            dtsm[t][mi.Name] = mi;
        if (tDump.BaseType != null)
            InitType(t, tDump.BaseType);
    }
    static void CheckType(Type t)
    {
        if (t == null)
            return;
        if (!dtsm.ContainsKey(t))
        {
            lock (dtsm)
            {
                if (!dtsm.ContainsKey(t))
                    InitType(t, null);
            }
        }
    }
    public static object GetField_AllAccess(this object obj, string fieldName)
    {
        if (obj == null)
            return null;
        var t = obj.GetType();
        CheckType(t);
        return ((System.Reflection.FieldInfo)dtsm[t][fieldName]).GetValue(obj);
    }
    public static void SetField_AllAccess(this object obj, string fieldName, object value)
    {
        if (obj == null)
            return;
        var t = obj.GetType();
        CheckType(t);
        ((System.Reflection.FieldInfo)dtsm[t][fieldName]).SetValue(obj, value);
    }
    public static object Invoke_AllAccess(this object obj, string methodName, params object[] paras)
    {
        if (obj == null)
            return null;
        var t = obj.GetType();
        CheckType(t);
        return ((System.Reflection.MethodInfo)dtsm[t][methodName]).Invoke(obj, paras);
    }
    public static object GetProperty_AllAccess(this object obj, string propertyName, params object[] index)
    {
        if (obj == null)
            return null;
        var t = obj.GetType();
        CheckType(t);
        return ((System.Reflection.PropertyInfo)
          dtsm[t][propertyName]).GetValue(obj, index.Length == 0 ? null : index);
    }
    public static void SetProperty_AllAccess(this object obj, 
      string propertyName, object value, params object[] index)
    {
        if (obj == null)
            return;
        var t = obj.GetType();
        CheckType(t);
        ((System.Reflection.PropertyInfo)dtsm[t][propertyName]).SetValue(obj, 
          value, index.Length == 0 ? null : index);
    }
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
ZTS
Web Developer
China China
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
-- There are no messages in this forum --