理解自定义特性(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); } } }
得到的运行结果如下图: