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 属性等
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?