此項目又分爲3個小項目:
1.WhatsNewAttributes類庫文件:用於定義定製特性類,標示跟新信息
2.myClass類庫文件:使用WhatsNew定製特性標記的類
3.Checker控制檯應用程序:用反射讀取myClass中的公共成員方法,以及定製特性
因此:myClass類庫需引入WhatsNewAttributes類庫編譯的DLL文件
Checker控制檯應用程序需引入myClass類庫編譯的DLL文件^-^,WhatsNewAttributes類庫編譯的DLL文件
WhatsNewAttributes類庫文件
- using System;
- namespace WhatsNewAttributes
- {
- /*
- * 特性類本身用一個特性System.AttributeUsage來標記,只能用在特性上,不能應用到類上
- * 該特性主要標示定製特性可應用到哪些類型的程序元素上
- *
- * AttributeTargets:指定定製特性可應用到哪些類型的程序元素上,可用"|"指定多個元素
- * AllowMultiple參數:表示一個特性是否可多次應用到同一項上
- * Inherited參數:表示應用到類,接口,方法,屬性上的特性可自動應用到所有派生類,接口,方法,屬性,重寫版本上
- *
- * 特性類派生於System.Attribute類
- */
- /***************** 定義特性類LastModifiedAttribute ******************/
- [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple=true, Inherited=false)]
- public class LastModifiedAttribute : Attribute
- {
- private DateTime _dateModified;
- private string _changes;
- private string _issues;
- //特性類構造函數
- public LastModifiedAttribute(string dateModified, string changes)
- {
- this._dateModified = DateTime.Parse(dateModified);
- this._changes = changes;
- }
- public DateTime DateModified
- {
- get { return _dateModified; }
- }
- public string Changes
- {
- get { return _changes; }
- }
- //特性類可選屬性
- public string Issues
- {
- get { return _issues; }
- set { _issues = value; }
- }
- }
- /***************** 定義特性類SupportsWhatsNewAttribute,指示該特性僅用於程序集 ******************/
- [AttributeUsage(AttributeTargets.Assembly)]
- public class SupportsWhatsNewAttribute : Attribute
- {
- }
- }
myClass類庫文件
- using System;
- //添加創建特性類生成的引用,包含其命名空間,這樣編譯器才能識別這些特性
- using WhatsNewAttributes;
- //用SupportsWhatsNes特性標記程序集本身
- [assembly : SupportsWhatsNew]
- namespace myClass
- {
- //在類上使用定製特性
- [LastModified("14 Feb 2008", "改良了XX功能1")]
- [LastModified("16 Jun 2010", "改良了XX功能2")]
- public class myClass
- {
- private string _my;
- public string My
- {
- get { return _my; }
- set { _my = value; }
- }
- //在方法上使用定製特性,添加可選屬性Issues
- [LastModified("17 Jun 2010", "改良:從寫了基類的ToString()方法", Issues="這是個突出問題")]
- public override string ToString()
- {
- return "新更新的重寫方法";
- }
- //私有方法
- private void myFun()
- { }
- }
- }
Checker控制檯應用程序
- using System;
- using System.Reflection;
- //添加創建特性類生成的引用,包含其命名空間,這樣編譯器才能識別這些特性
- using WhatsNewAttributes;
- namespace Checker
- {
- class Checker
- {
- static void Main(string[] args)
- {
- /* Assembly類:在System.Reflection命名空間定義,允許訪問給定程序集的元數據
- * 1.使用Assembly實例前,需要加入相應程序集
- * Assembly.Load():參數爲程序集名稱
- * Assembly.LoadFrom():參數爲程序集的完整路徑名
- * 2.查找在程序集中定義的類型Assembly.GetTypes()
- * 3.查找程序集的定製特性Attribute.GetCustomAttributes(assemblyObj)
- * 定義定製特性時,必須爲他們編寫類,定製特性與對象一樣,加載了程序集後
- * 就可以讀取這些特定對象,查看他們的屬性,調用他們的方法
- * a.所有特性都作爲一般Attribute引用來獲取
- * b.如要調用爲定製特性定義的方法屬性,就要把這些引用顯示轉化爲相關定製特性類
- */
- Assembly theAssembly = Assembly.Load("myClass");
- Attribute supportsAttribute = Attribute.GetCustomAttribute(theAssembly,typeof(SupportsWhatsNewAttribute));
- string Name = theAssembly.FullName;
- if (supportsAttribute == null)
- {
- Console.WriteLine("此程序集不支持SupportsWhatsNew特性");
- return;
- }
- else
- {
- Console.WriteLine("程序集:" + Name);
- }
- //Assembly類的特性可以獲得在相應程序集中定義的所有類型的信息
- //調用GetTypes()方法,獲得此程序集中定義的類型數組,此處只定義了一個myClass類
- Type[] types = theAssembly.GetTypes();
- //注:此處如果只要同一項目下的某類的類型,可以直接使用typeof(ClassName)來代替
- Console.WriteLine("信息總數:" + types.Length); //1
- foreach (Type definedType in types)
- {
- //如果該definedType不是一個類
- if (!(definedType.IsClass))
- {
- //退出程序
- return;
- }
- else
- {
- Console.WriteLine("成員名:" + definedType.Name); //myClass
- }
- //檢索myClass類的自定義屬性數組
- Attribute[] attribs = Attribute.GetCustomAttributes(definedType);
- if (attribs.Length == 0)
- {
- Console.WriteLine("這個類沒有改良過");
- }
- else
- {
- foreach (Attribute attrib in attribs)
- {
- WriteAttributeInfo(attrib);
- }
- }
- //檢索myClass類的所有公共方法數組
- MemberInfo[] methods = definedType.GetMethods();
- Console.WriteLine("修改過的方法:");
- foreach (MethodInfo nextMethod in methods)
- {
- //檢索myClass類的當前公共方法的由LastModifiedAttribute標示的定製屬性數組
- object[] attribs2 = nextMethod.GetCustomAttributes(typeof(LastModifiedAttribute), false);
- if (attribs2 != null)
- {
- Console.WriteLine( nextMethod.ReturnType + " " + nextMethod.Name + "()");
- foreach(Attribute nextAttrib in attribs2)
- {
- WriteAttributeInfo(nextAttrib);
- }
- }
- }
- }
- Console.ReadLine();
- }
- //顯示該自定義屬性的信息
- public static void WriteAttributeInfo(Attribute attrib)
- {
- //定義特性類LastModifiedAttribute就是爲了方便實例化後訪問類中個屬性
- LastModifiedAttribute lastModifiedAttrib = attrib as LastModifiedAttribute;
- if (lastModifiedAttrib == null)
- {
- return;
- }
- DateTime modifiedDate = lastModifiedAttrib.DateModified;
- Console.WriteLine("改良:" + modifiedDate.ToLongDateString() + "," + lastModifiedAttrib.Changes);
- if (lastModifiedAttrib.Issues != null)
- {
- Console.WriteLine("突出問題:" + lastModifiedAttrib.Issues);
- }
- }
- }
- }