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 所具有的特性信息,赋值给 canCanSpeakForeignLanguage 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
本文系本人转载博客园中的文章(略有修改),未能给出原文连接,若侵犯文章原作者的权益,请联系本人,本人将马上删除!
浙公网安备 33010602011771号