using System;
namespace ClassLibrary1 {
public class Class1 {
public Class1() { }
public int GetSum(int x, int y) {
return x + y; } } }
//再另建一个项目,在项目中引用上面生成的ClassLibrary1.DLL
System.Reflection.Assembly a = System.Reflection.Assembly.LoadFrom("ClassLibrary1.DLL");
System.Type t = a.GetType("ClassLibrary1.Class1");
//动态生成ClassLibrary1.Class类的实例
Object theObj = System.Activator.CreateInstance(t);
//参数信息,GetSum需要两个int参数
System.Type[] paramTypes = new System.Type[2];
paramTypes[0] = System.Type.GetType("System.Int32"); paramTypes[1] = System.Type.GetType("System.Int32");
System.Reflection.MethodInfo mi = t.GetMethod("GetSum", paramTypes);
//参数值
Object[] parameters = new Object[2]; parameters[0] = 3; parameters[1] = 4;
Object returnValue = mi.Invoke(theObj, parameters);
Console.WriteLine("ClassLibrary1.Class1.GetSum(3, 4) returns: {0}", returnValue.ToString()); 2.用反射访问类的私有成员。
如果是C++,我们可以计算对象内成员的位置,然后偏移指针以访问类型的所有非公开成员。但是.NET对象完全受GC管理,地址根本无法得到,并且也无法通过指针调用方法。 当然... 这是一种很不值得推荐的技巧,访问非公有成员很可能破坏对象状态,造成不可预料的后果。但是无论如何,利用.NET的反射机制可以做到。 比如这样一个类:
class MyClass {
private string PrivateField = "Private Field";
protected string ProtectedField = "Protected Field";
private string _ProtectedProperty = "Protected Property"; protected string ProtectedProperty
wk_ad_begin({pid : 21});wk_ad_after(21, function(){$('.ad-hidden').hide();}, function(){$('.ad-hidden').show();});
{
get{return _ProtectedProperty;} set{_ProtectedProperty = value;} }
private string _PrivateProperty = "Private Property"; private string PrivateProperty {
get{return _PrivateProperty;} set{_PrivateProperty = value;} }
protected void ProtectedMethod() {
Console.WriteLine("Protected Method Invoked"); }
private void PrivateMethod() {
Console.WriteLine("Private Method Invoked"); } }
除了默认的构造函数,没有任何成员是公开的,但是我仍然想获取和设置Field和Property的值,以及调用那两个方法。方法是:
MyClass mc = new MyClass(); Type t = typeof(MyClass);
BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic;
// Fields
FieldInfo fi_protected = t.GetField("ProtectedField",bf); FieldInfo fi_private = t.GetField("PrivateField",bf);
Console.WriteLine(fi_protected.GetValue(mc)); Console.WriteLine(fi_private.GetValue(mc)); fi_private.SetValue(mc,"New Private Field"); Console.WriteLine(fi_private.GetValue(mc));
Console.WriteLine();
// Properties
PropertyInfo pi_protected = t.GetProperty("ProtectedProperty", bf); PropertyInfo pi_private = t.GetProperty("PrivateProperty", bf);
Console.WriteLine(pi_protected.GetValue(mc,null)); Console.WriteLine(pi_private.GetValue(mc,null)); pi_private.SetValue(mc,"New Private Property",null); Console.WriteLine(pi_private.GetValue(mc,null));
Console.WriteLine();
// Methods
MethodInfo mi_protected = t.GetMethod("ProtectedMethod", bf); MethodInfo mi_private = t.GetMethod("PrivateMethod", bf);
mi_protected.Invoke(mc,null); mi_private.Invoke(mc,null);
1628




被折叠的 条评论
为什么被折叠?



