作者:许冠中一亦 | 来源:互联网 | 2024-11-07 18:47
本文深入探讨了C#中的反射与特性功能。首先,介绍了反射的基本概念,即通过元数据(包括类的方法、属性和字段等)在运行时动态获取和操作程序信息的能力。此外,还详细解析了特性的使用方法及其在代码注解和元数据扩展中的重要作用,为开发者提供了丰富的编程技巧和实践指导。
一、什么是反射?
了解反射之前我们必须知道一个概念——元数据。有关程序和程序类型的信息叫做元数据,通俗的解释就是类里面的方法、属性、字段等。
而程序在运行的时候去查看其它程序集的行为就叫做反射。在我们不知道类的内部情况时,反射可以让我们获取类里所有的方法、属性等。
二、怎么实现?
c#的基础类库声明了一个叫做Type的类,我们通过创建Type类的实例来调用Type,Type中包含了类型信息。我们可以通过GetType方法跟typeof方法来获取对象。
下面说一下两者的使用方法;
Type t = item.GetType(); //在不知道Type类型内部的情况下,一般使用GetType方法来获取对象
Type t = typeof(Myclass); //在使用typeof()方法之前我们需要获取类型名
//几种常用的方法
FieldInfo[] f = t.GetFields(); //GetField()方法获取t中的所以字段并放入数组f中
object[] o = t.GetMethods(); //GetMethods()方法获取t中的方法
三、反射注意事项
1、一定要记得加上System.Reflection命名空间。
2、获取方法的时候一定得是object类型,因为方法的返回值不一样,只能用objec接收。
四、什么是特性?
特性可以看做是一种特殊的类,他允许我们向程序集中添加元数据。例如Myclass类应用了特性,那么它就叫做目标,而它的子类或者是type类获取Myclass里面的
元数据,那么它们就被称之为消费者。
五、特性应用
.NET.预定了很多特性,我们也可以自己声明自定义特性。
[Obsolete("多捞哦", true)] //Obsolete是预定的特性:过时,表示已弃用,若不加true,方法可以运行,但是会警告,加了true就无法运行,系统会报错
static void Show()
{
Console.WriteLine("运行成功");
}
[AttributeUsage(AttributeTargets.Class)] //这个是自定义特性
public sealed class ReviewCommentAttribute : System.Attribute
{
public string Description { get; set; }
public string VersionNumber { get; set; }
public string ReviewerID { get; set; }
public ReviewCommentAttribute(string desc, string ver)
{
Description = desc;
VersionNumber = ver;
}
}
[ReviewComment("Check it out","2.4")] //这里是调用前面的特征类,可以省略后缀Attribute
class MyClass { }
Type类提供的两种访问特性的方法IsDefined 和 GetCustomAttributes 经常使用。
//IsDefined函数需要两个参数,返回值为bool类型
bool isdefined = t.IsDefined(typeof(ReviewCommentAttribute), false);
//GetCustomAttributes返回为object类型
object[] AttArr = t2.GetCustomAttributes(false);
//用as强转为MyAttributeAttribute类型
MyAttributeAttribute attr = item as MyAttributeAttribute;
特性本身可以看做是一个类,有个预定义特性可以用在自定义特性上来限制自定义特性:AttributeUsage
[AttributeUsage(AttributeTargets.Class)] //针对Class 类,还可以是Method 方法,Proprietary 属性等