映射
在許多情況下,我們需要一種方法,能夠從元數據中訪問屬性,C#提供了對映射的支持以訪問元數據。通過初始化MemberInfo類型對象,System.Reflection名字空間中的這個對象可以用來發現成員的屬性,對元數據進行訪問。
System.Reflection.MemberInfoinf=typeof(MyMath);
對MyMath類型調用typeof操作符,它返回一個由繼承MemberInfo而生成的Type類型的變量。
下一步是對MemberInfo對象調用GetCustomAttributes,并將希望得到的屬性的類型作為一個參數傳遞給GetCustomAttributes。我們將得到一個對象數組,數組的每個成員的類型都是BugFixAttribute。
object[]attributes; attributes=Attribute.GetCustomAttributes(inf,typeof(BugFixAttribute));
我們就可以遍歷這個數組了,打印BugFixAttribute對象的數組,代碼下所示:
屬性的打印
publicstaticvoidMain() { MyMathmm=newMyMath(); Console.WriteLine("CallingDoFunc(7).Result:{0}", mm.DoFunc1(7));
//獲取成員信息并使用它訪問自定義的屬性 System.Reflection.MemberInfoinf=typeof(MyMath); object[]attributes; attributes= Attribute.GetCustomAttributes(inf,typeof(BugFixAttribute));
//遍歷所有的屬性 foreach(Objectattributeinattributes) { BugFixAttributebfa=(BugFixAttribute)attribute; Console.WriteLine("\nBugID:{0}",bfa.BugID); Console.WriteLine("Programmer:{0}",bfa.Programmer); Console.WriteLine("Date:{0}",bfa.Date); Console.WriteLine("Comment:{0}",bfa.Comment); } }
類型發現
我們可以通過映象的方法來研究一個組合實體的內容,如果要建立需要顯示組合體內部信息的工具或動態地調用組合體中的途徑,這一方法是非常有用的。
通過映象的方法,我們可以知道一個模塊、方法、域、屬性的類型,以及該類型的每個方法的信號、該類支持的界面和該類的超級類。我們可以通過如下的形式,用Assembly.Load靜態方法動態地加載一個組合體:
publicstaticAssembly.Load(AssemblyName)
然后,可以將它傳遞到核心庫中。
Assemblya=Assembly.Load("Mscorlib.dll");
一旦加載了組合體,我們可以通過調用GetTypes返回一個Type對象數組。Type對象是映射的核心,它表示類、界面、數組、值和枚舉等的類型定義。
Type[]types=a.GetTypes();
組合休會返回一個類型的數組,我們可以使用foreach-loop結構顯示該數組,其輸出將有好幾頁文檔之多,下面我們從中找一小段:
TypeisSystem.TypeCode TypeisSystem.Security.Util.StringExpressionSet TypeisSystem.Text.UTF7Encoding$Encoder TypeisSystem.ArgIterator TypeisSystem.Runtime.Remoting.JITLookupTable 1205typesfound
我們得到了一個內容為核心庫中類型的數組,可以將它們都打印出來,該數組將有1205個項。
對一種類型映射我們也可以對組合體中一種類型進行映射。為此,我們可以使用GetType方法從組合體中解析出一個類型:
|