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 属性等

 

posted @   Darius丶段  阅读(338)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示