C# 用反射调用自定义特性

一、简介

特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。

特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。

预定义特性(Attribute)

.Net 框架提供了三种预定义特性:

  • AttributeUsage
  • Conditional
  • Obsolete

AttributeUsage

预定义特性 AttributeUsage 描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。

Conditional

这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符。

它会引起方法调用的条件编译,取决于指定的值,比如 Debug 或 Trace。例如,当调试代码时显示变量的值。

Obsolete

这个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。例如,当一个新方法被用在一个类中,但是您仍然想要保持类中的旧方法,您可以通过显示一个应该使用新方法,而不是旧方法的消息,来把它标记为 obsolete(过时的)。

二、自定义特性

接下来的自定义特性 主要以AttributeUsage为主

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace 特性
{
    class Program
    {
        static void Main(string[] args)
        {
            Test();
            Console.ReadKey();
        }

        static void Test()
        {
            //获取程序集所有的类
            Type[] types = typeof(Basketball).Assembly.GetTypes();
            //遍历所有的类
            foreach (Type t in types)
            {
                //遍历当前类所有的方法
                foreach (MethodInfo method in t.GetMethods())
                {
                    //遍历当前方法的上的所有特性
                    foreach (Attribute attr in method.GetCustomAttributes())
                    {
                        //如果特性是 鸡你太美
                        if (attr is 鸡你太美)
                        {
                            //实例化当前类的实例
                            object reflectTest = Activator.CreateInstance(t);
                            //获取当前方法的名字
                            MethodInfo methodInfo = t.GetMethod(method.Name);
                            //执行当前方法
                            methodInfo.Invoke(reflectTest, null);
                        }
                    }
                }
            }
        }
    }

    //自定义特性类
    [AttributeUsage(AttributeTargets.All)]
    public class 鸡你太美 : Attribute
    {
        public 鸡你太美() { }
    }

    public class Basketball
    {
        //鸡你太美 是特性类的名字,

        [鸡你太美]
        public void Start()
        {
            Console.WriteLine("鸡你太美 start");
        }

        [鸡你太美]
        public void Updata()
        {
            Console.WriteLine("鸡你太美 updata");
        }

        public void Awaken()
        {
            Console.WriteLine("Awaken~~~~~~");
        }
    }

}

调用:

 Test 方法中可以看到,是利用反射获取 Basketball 类中所有的 Type,然后根据 Type 遍历了 类中所有的方法,如果方法的特性是 鸡你太美,那么就直接实例化对象,然后调用方法,这里实例化对象这种写法并不是很推荐,如果有对象的实例,直接传过来也是可以的。

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊思宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值