• C#使用反射机制获取类信息


    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 :-)
    原地址:http://blog.csdn.net/zhoufoxcn/article/details/1358095
     
  • 相关阅读:
    Java关键字:transient,strictfp和volatile简介
    freemarker 数字格式化函数
    使用 BeanCopier 复制对象
    扩展Smack Message
    JavaScript 中2个等号与3个等号的区别
    Eclipse 3.5使用dropins的插件安装方式
    常见的HTTP 状态代码
    使用python操作FTP上传和下载
    Python操作redis
    Ubuntu14.04安装redis和简单配置
  • 原文地址:https://www.cnblogs.com/gyc19920704/p/6509882.html
Copyright © 2020-2023  润新知