110,538
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Reflection;
//======================
public object CallNonPublicMethod(object instance, string methodName, object[] param)
{
Type type = instance.GetType();
MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic);
object result;
try
{
result = method.Invoke(instance, param);
}
catch (TargetInvocationException ex)
{
throw ex.InnerException;
}
return result;
}
/* c#里利用反射功能实现调用私有方法 */
public class A
{
protected int a = 123;
}
那么只有继承A的派生类 才能获取到a的值。
public class B : A
{
public B()
{
int b = base.a;
}
}
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);
}