反射学习

public class RefectionClass {

    //    反射的定义:审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,System.Reflection命名空间包含的几个类,允许你反射(解析)这些元数据的代码

    //一、反射的作用:
    //动态的创建类型的实例,将类型邦定到现有对象,或从现有对象中获取类型
    //应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射
    //反射主要应用於类库,这些类库需要知道一个类型的定义,以便提供更多的功能

    //二、应用要点:
    //现实应用程序中很少使用到反射
    //使用反射动态邦定需要牺牲性能
    //有些元数据信息是不能通过反射获取的
    //某些反射类型是专门為那些CLR开发编辑器开发使用的,所以你要意思到不是所有反射类型都是可以使用的

    //三、取得Assembly的方法:
    //Assembly.Load
    //Assembly.LoadFile
    //Assembly.LoadFrom
    //Type对象的Assembly方法

    //四、反射的成员:
    //MemberInfo-成员
    //ConstructorInfo-结构
    //FieldInfo-字段
    //MethodInfo-方法
    //PropertyInfo-属性
    //EventInfo-事件

    #region 通过反射获取创建类的实例
    //Assembly对象的 CreateInstance方法
    public static void Assembly_CreateInstance() {
        string assmblyName = "AppTest";
        string className = assmblyName + ".Member";
        //获取当前命名控件下的程序集
        Assembly assm = Assembly.Load(assmblyName);
        //获取当前命名空间下的所有类
        //Type[] typeArray = assm.GetTypes();
        //if (typeArray == null || typeArray.Length == 0) {
        //    Console.WriteLine("命名空间为" + assmblyName + "下没有类");
        //}
        //foreach (Type type in typeArray) {
        //    Console.WriteLine("类名为:" + type.Name + ",FullName:" + type.FullName);
        //}
        //通过程序集创建实例 --无参
        Member member = (Member)assm.CreateInstance(className);
        Console.WriteLine("在加载程序集的时候创建无参实例:Name:" + member.Name + "  ID:" + member.ID);
        //忽略大小写创建实例
        //Member member = (Member)assm.CreateInstance(className,true);

        //根据程序集创建实例 --有参数
        Object[] parameters = new Object[2];
        parameters[0] = 10000;
        parameters[1] = "Sanny";
        //一定要注意每个参数含义
        Member member1 = (Member)assm.CreateInstance(className, false, BindingFlags.Default, null, parameters, null, null);
        Console.WriteLine("在加载程序集的时候创建有参数实例:Name:" + member1.Name + "  ID:" + member1.ID);
        Console.ReadLine();
    }
    //Activator对象的 CreateInstance方法
    public static void Activator_CreateInstance() {
        string assmblyName = "AppTest";
        string className = assmblyName + ".Member";
        //注意ObjectHandle含义
        System.Runtime.Remoting.ObjectHandle entity = Activator.CreateInstance(assmblyName, className);
        Member member = (Member)entity.Unwrap();
        Console.WriteLine("Activator创建无参实例:Name:" + member.Name + "  ID:" + member.ID);
        Type type = Type.GetType(className);
        //Member member1 = (Member)Activator.CreateInstance(type);
        Object[] parameters = new Object[2];
        parameters[0] = 10000;
        parameters[1] = "Sanny";
        System.Runtime.Remoting.ObjectHandle entity1 = Activator.CreateInstance(assmblyName, className, false, BindingFlags.Default, null, parameters, null, null);
        Member member1 = (Member)entity1.Unwrap();
        Console.WriteLine("Activator创建有参数实例:Name:" + member1.Name + "  ID:" + member1.ID);
        Console.ReadLine();
    }
    //使用Type的InvokeMember方法来取得对象的实例
    public static void Type_InvokeMember() {
        string assmblyName = "AppTest";
        string className = assmblyName + ".Member";
        Type type = Type.GetType(className);
        if (type == null) {
            Console.WriteLine("没有该类");
        }
        Member member = (Member)type.InvokeMember(className, BindingFlags.CreateInstance, null, null, null);
        Console.WriteLine("InvokeMember创建无参数实例:Name:" + member.Name + "  ID:" + member.ID);
        Object[] parameters = new Object[2];
        parameters[0] = 10000;
        parameters[1] = "Sanny";
        Member member1 = (Member)type.InvokeMember(className, BindingFlags.CreateInstance, null, null, parameters);
        Console.WriteLine("InvokeMember创建有参数实例:Name:" + member1.Name + "  ID:" + member1.ID);
        Console.ReadLine();

    }

    #endregion

    #region 调用类的方法
    //调用类的方法
    public static void InvokeMemberMethodInfo() {
        string assemblyName = "AppTest";
        string className = assemblyName + ".Member";
        Type type = Type.GetType(className);
        if (type == null) {
            Console.WriteLine("没有该类");
        }
        MethodInfo methodInfo = type.GetMethod("GetName");
        //获取所有方法
        // MemberInfo[] methodArray = type.GetMethods();
        if (methodInfo == null) {
            Console.WriteLine("没有该方法");
        }
        Member member = (Member)type.InvokeMember(className, BindingFlags.CreateInstance, null, null, null);
        //Type对象的 InvokeMember方法
        //MethodInfo对象的Invoke方法
        var result = (string)methodInfo.Invoke(member, null);
        // Type对象的 InvokeMember方法来动态调用方法
        //var result = (string)type.InvokeMember("GetName", BindingFlags.InvokeMethod, null, member, null);
        Console.WriteLine("通过Type来获取InvokeMember:Name:" + result );
        Console.ReadLine();
    }
    #endregion

    #region 反射获取类的字段信息
    public static void Refection_FiedInfo() {
        string assmblyName = "AppTest";
        string className = assmblyName + ".Member";
        Type type = Type.GetType(className);
        if (type==null) {
            return;
        }
        //在获取所有属性的时候,要注意添加方法参数,如果没有方法参数的话默认查询的是公共的字段
        FieldInfo[] fieldArray=type.GetFields(BindingFlags.NonPublic  | BindingFlags.Instance | BindingFlags.DeclaredOnly);
        foreach (FieldInfo filed in fieldArray) {
            Console.WriteLine("字段名称为:"+filed.Name +" 字段类型:"+filed.FieldType);
        }
        Console.ReadLine();
    }

    #endregion


    #region 反射获取类的属性信息
    public static void Refection_PropertiesInfo() {
        string assmblyName = "AppTest";
        string className = assmblyName + ".Member";
        Type type = Type.GetType(className);
        if (type == null) {
            return;
        }
        //在获取所有属性的时候,要注意添加方法参数,如果没有方法参数的话默认查询的是公共的字段
        PropertyInfo[] propertiesArray = type.GetProperties(BindingFlags.Public|BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
        foreach (PropertyInfo property in propertiesArray) {
            Console.WriteLine("属性名称为:" + property.Name + " 属性类型:" + property.PropertyType);
        }
        Console.ReadLine();
    }
    #endregion

}

//--------------------------------------------------------------------------------
//以上所使用的AppTest.Member為:
//新建一个AppTest类库,在其下建立一个Member的类

public class Member {
    private int _id = 1;
    public int ID {
        get { return _id; }
        set { _id = value; }
    }
    private string _name = "Tom";
    public string Name {
        get { return _name; }
        set { _name = value; }
    }

    public Member() { }
    public Member(int id, string name) {
        _id = id;
        _name = name;
    }


    public string GetName() {
        return _name;
    }

}

参考:

C#反射机制详解

C#之玩转反射

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值