理解自定义特性(Attribute)

假设 外语老师 是一个类,
那么 外语老师 应该具有这样的特性:会说外语
并且 会说外语 这一特性又包含一些信息,比如:外语种类、外语水平、其它信息。

按照这样的理解,应该有下面的实现。

using System;
using System.Reflection;

namespace Test_Console
{

    //自定义一个特性,名为 CanSpeakForeignLanguage ,继承自 System.Attribute
    [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)]
    public class CanSpeakForeignLanguage : System.Attribute
    {
        private string _languageType;
        private int _languageLevel;
        private string _languageInfo;

        //必须定义其构造函数,如果不定义有编译器提供无参默认构造函数 
        public CanSpeakForeignLanguage()
        {
        }

        public CanSpeakForeignLanguage(string languageType, int languageLevel)
        {
            _languageType = languageType;
            _languageLevel = languageLevel;
        }

        //定义属性 
        //特性和属性不是一回事
        public string LanguageType
        {
            get { return _languageType == null ? string.Empty : _languageType; }
        }
        public int LanguageLevel
        {
            get { return _languageLevel; }
        }
        public string LanguageInfo
        {
            get { return _languageInfo; }
            set { _languageInfo = value; }
        }

        //定义方法 
        public void CanSpeak()
        {
            Console.WriteLine("He can speak {0}.", _languageType == null ? "Chinese Only" : _languageType);
        }
    }


    //定义一个类,LanguageTeacher ,这个类具有 CanSpeakForeignLanguage 特性
    [CanSpeakForeignLanguage("English", 8, LanguageInfo = "This is US English, but not England English.")]
    public class LanguageTeacher
    {
        public void SayHello()
        {
            Console.WriteLine("Hello, I'm a Foreign Language teacher, I can speak Foreign Language.");
        }
    }

    //主程序 
    class Program
    {
        static void Main(string[] args)
        {
            Type type = typeof(LanguageTeacher);
            MemberInfo memberinfo = type;

            //利用反射获得 LanguageTeacher 所具有的特性信息,赋值给 can
            CanSpeakForeignLanguage can = (CanSpeakForeignLanguage)Attribute.GetCustomAttribute(memberinfo, typeof(CanSpeakForeignLanguage));

            //输出 LanguageTeacher 的特性信息
            if (can != null)
            {
                Console.WriteLine("Class of LanguageTeacher Can Speak: " + can.LanguageType);
                Console.WriteLine("The English Level of LanguageTeacher is: " + can.LanguageLevel);
                Console.WriteLine("And, " + can.LanguageInfo);
            }
            Console.WriteLine();

            //反射创建 LanguageTeacher 对象,执行它的 SayHello 方法
            object obj = Activator.CreateInstance(type);
            MethodInfo mi = type.GetMethod("SayHello");
            mi.Invoke(obj, null);
        }
    }
}

得到的运行结果如下图:

原文地址:https://www.cnblogs.com/cnliu/p/1673384.html