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);
        }
    }
}



作者:luckdv
本文系本人转载博客园中的文章(略有修改),未能给出原文连接,若侵犯文章原作者的权益,请联系本人,本人将马上删除!
posted @ 2010-03-10 14:47  luckdv  阅读(377)  评论(0)    收藏  举报