码迷,mamicode.com
首页 > Windows程序 > 详细

C#使用反射机制获取类信息[转]

时间:2016-05-10 18:03:54      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

http://www.cnblogs.com/zhoufoxcn/archive/2006/10/31/2515873.html
1.用反射动态创建类实例,并调用其公有成员函数。
//新建一个类库项目,增加一个GetSum方法。
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
{
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);

Console.ReadLine();

输出:
Protected Field
Private Field
New Private Field

Protected Property
Private Property
New Private Property

Protected Method Invoked
Private Method Invoked
事件,一样可以操作, EventInfo :-)

C#使用反射机制获取类信息[转]

标签:

原文地址:http://www.cnblogs.com/mazhenyu/p/5478379.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!