【C#】反射、特性和动态编程 --《C#本质论》

本文详细介绍了C#中的反射机制,包括如何访问程序集元数据和动态调用类型成员。接着探讨了特性,如System.AttributeUsageAttribute、具名参数和预定义特性System.ConditionalAttribute与System.ObsoleteAttribute。最后,讨论了C#4.0引入的动态对象,以及使用dynamic关键字进行反射调用和其工作原理。
摘要由CSDN通过智能技术生成

一、反射

反射是指对程序集中的元数据进行检查的过程。当C#被编译成CIL时,它会维持关于代码的大部分元数据(以前代码被编译成机器语言时,会丢弃元数据)。

利用反射可以枚举出程序集中的所有类型,找出满足特定条件的那些。

1、反射可以做的事

1.1 访问程序集中的元数据

读取类型的元数据,关键在于获得System.Type的一个实例,它代表目标类型实例。System.Type提供了获取类型信息的所有方法。获得对类型的Type的引用主要通过object.GetType() 或typeof()

        //object.GetType():获取一个对象实例
        //静态类无法使用,因为静态类无法实例化
        DateTime dateTime = new DateTime();
        Type type = dateTime.GetType();
        foreach (var item in type.GetProperties())
        {
            Console.WriteLine(item.Name);
        }

        //Enum.Parse():获取标识了一个枚举的type对象,将一个字符串转换成特定的枚举值
        ThreadPriorityLevel level = (ThreadPriorityLevel)Enum.Parse(typeof(ThreadPriorityLevel), "Idle");

1.2 使用元数据在运行时动态调用类型的成员

demo没怎么看懂,先放着

2、泛型类型上的反射

CLR2.0新增了一些列方法来判断给定类型是否支持泛型参数和泛型实参:

Type type;
type = typeof(Nullable<>);
Console.WriteLine(type.IsGenericType); //指示类型是否为泛型
Console.WriteLine(type.ContainsGenericParameters);  //指示类型是否包含泛型实参

type = typeof(Nullable<DateTime>);
Console.WriteLine(type.ContainsGenericParameters);
Console.WriteLine(type.IsGenericType);

从泛型获取泛型实参: 

        Stack<int> stack = new Stack<int>();
        Type type=stack.GetType();

        //调用GetGenericArguments()可获得一个由System.Type实例构成的一个数组,实例顺序是它们被声明的顺序
        foreach (var item in type.GetGenericArguments())
        {
            Console.Write(item.Name+"  "+ item.FullName);
        }

 输出࿱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值