1目的
当反射调用dll时,我们可能想要获取类中对应的私有变量,但是普通的调用是看不到私有变量,需要我们做进一步处理
2实现
命名空间
using System.Reflection;
public static class GetPrivateEx
{
public static T GetPrivateField<T>(object instance,string fieldname)
{
//绑定的类型是不是公开类型
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
Type type = instance.GetType();
FieldInfo fieldInfo = type.GetField(fieldname, bindingFlags);
return (T)fieldInfo.GetValue(instance);
}
public static T GetPrivateProperty<T>(object instance,string propertyName)
{
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
Type type = instance.GetType();
PropertyInfo propertyInfo = type.GetProperty(propertyName, bindingFlags);
return (T)propertyInfo.GetValue(instance);
}
}
增加个模拟类
public class Test
{
private string ss;
public string ss1;
protected string ss2;
private string SS
{
get { return ss; }
set { ss = value; }
}
public string SS1
{
get { return ss1; }
set { ss1 = value; }
}
protected string SS2
{
get { return ss2; }
set { ss2 = value; }
}
public Test()
{
this.ss = "123";
this.ss1 = "1234";
this.ss2 = "12345";
}
}
测试
static void Main(string[] args)
{
Test test = new Test();
string ss = GetPrivateEx.GetPrivateField<string>(test, "ss");
string ss1 = test.ss1;
string ss2 = GetPrivateEx.GetPrivateField<string>(test, "ss2");
Console.WriteLine("--------ss------");
Console.WriteLine(ss);
Console.WriteLine("--------ss1-----");
Console.WriteLine(ss1);
Console.WriteLine("--------ss2-----");
Console.WriteLine(ss2);
Console.WriteLine("-------property-----");
string SS = GetPrivateEx.GetPrivateProperty<string>(test, "SS");
string SS1 = test.SS1;
string SS2 = GetPrivateEx.GetPrivateProperty<string>(test, "SS2");
Console.WriteLine("--------SS------");
Console.WriteLine(SS);
Console.WriteLine("--------SS1-----");
Console.WriteLine(SS1);
Console.WriteLine("--------SS2-----");
Console.WriteLine(SS2);
Console.ReadLine();
}
输出
--------ss------
123
--------ss1-----
1234
--------ss2-----
12345
-------property-----
--------SS------
123
--------SS1-----
1234
--------SS2-----
12345
结论
可以看出,能够模拟出得到类中的私有变量和保护类型的变量和类型