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:
private void button1_Click(object sender, EventArgs e)
{
System.Console.WriteLine(this.Text);
this.SetField_AllAccess("userWindowText", "test");
var x = this.GetField_AllAccess("userWindowText");
System.Console.WriteLine(x);
this.Invoke_AllAccess("Hide"); 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.
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);
}
}