ShowTypeAttributes 副程式
''' <summary>
''' 直接顯示型別相關資訊
''' </summary>
Sub ShowTypeAttributes()
Dim type As Type = GetType(String)
' 取得型別屬性
GetTypeAttribute(type)
' 取得型別自訂屬性
ShowCustomAttribute(type)
' 取得型別 Getxxx
ShowTypeGetxxx(type)
End Sub
這裡很簡單,只是取得型別後,我想顯示一些型別的屬性、方法。我把這些方法另外再分為三個小副程式。
GetTypeAttribute 副程式
''' <summary>
''' 由物件取得型別後,額外顯示相關屬性
''' </summary>
''' <param name="type">Type (型別)</param>
Sub GetTypeAttribute(type As Type)
Console.WriteLine("型別的屬性")
Console.WriteLine("Assembly : {0}", type.Assembly)
Console.WriteLine("AQN : {0}", type.AssemblyQualifiedName)
Console.WriteLine("Attributes: {0}", type.Attributes)
Console.WriteLine("BaseType: {0}", type.BaseType)
Console.WriteLine("FullName: {0}", type.FullName)
Console.WriteLine("HasElementType: {0}", type.HasElementType)
Console.WriteLine("IsAbstract: {0}", type.IsAbstract)
Console.WriteLine("IsByRef: {0}", type.IsByRef)
Console.WriteLine("IsClass: {0}", type.IsClass)
Console.WriteLine("IsEnum: {0}", type.IsEnum)
Console.WriteLine("IsGenericType: {0}", type.IsGenericType)
Console.WriteLine("IsInterface: {0}", type.IsInterface)
Console.WriteLine("IsMarshalByRef: {0}", type.IsMarshalByRef)
Console.WriteLine("IsNotPublic: {0}", type.IsNotPublic)
Console.WriteLine("IsPrimitive: {0}", type.IsPrimitive)
Console.WriteLine("IsPublic: {0}", type.IsPublic)
Console.WriteLine("IsSealed: {0}", type.IsSealed)
Console.WriteLine("IsValueType: {0}", type.IsValueType)
Console.WriteLine("IsVisible: {0}", type.IsVisible)
Console.WriteLine("Module: {0}", type.Module)
Console.WriteLine("Name: {0}", type.Name)
Console.WriteLine("Namespace: {0}", type.Namespace)
Console.WriteLine()
Console.ReadLine()
End Sub
我們列出前一篇文章裡所提到的 Isxxx 屬性,這一類 Isxxx 都是回傳 Boolean 值,我建議打開 MSDN 裡的 System.Type 屬性對照著看,會比較清楚。
ShowCustomAttribute 副程式
''' <summary>
''' 由傳入參數,顯示相關型別相關屬性
''' </summary>
''' <param name="type">Type (型別)</param>
Sub ShowCustomAttribute(type As Type)
Console.WriteLine("取得類別屬性:")
For Each attr As Attribute In type.GetCustomAttributes(True)
Console.WriteLine(" {0}", attr.GetType.Name)
Next
Console.WriteLine()
End Sub
這裡注意我們使用的 type.GetCustomAttributes(True) 必須傳入一個 Boolean 值,true 表示要搜尋這個成員的繼承鏈結以尋找屬性,否則為 false。 對於屬性和事件來說,會忽略這個參數。若要搜尋屬性 (Property) 和事件之屬性 (Attribute) 繼承鏈結,請使用 Attribute.GetCustomAttributes 方法的適當多載。
ShowTypeGetxxx 副程式
這裡就精彩了。ShowTypeGetxxx 又是另一個進入點,然後在裡面分別呼叫其他 7 支副程式,顯示此型別的屬性、巢狀型別、成員、建構子、事件、欄位、方法。
#Region "顯示型別相關 Getxxx 方法"
''' <summary>
''' 呼叫型別相關 Getxxx 測試方法
''' </summary>
''' <param name="type">型別 (即Type) 物件</param>
Sub ShowTypeGetxxx(type As Type)
' 顯示型別屬性
ShowGetProperties(type)
' 顯示型別巢狀型別
ShowGetNestedTypes(type)
' 顯示型別成員
ShowGetMembers(type)
' 顯示型別建構子
ShowGetConstructors(type)
' 顯示型別事件
ShowGetEvent(type)
' 顯示型別欄位
ShowGetFields(type)
' 顯示型別方法
ShowGetMethods(type)
End Sub
''' <summary>
''' 簡單測試及顯示型別的屬性(Properties)
''' </summary>
''' <param name="type">型別 (即Type) 物件</param>
Private Sub ShowGetProperties(type As Type)
Console.WriteLine("取得型別Properties")
For Each pi As PropertyInfo In type.GetProperties
Console.WriteLine("{0}", pi.Name)
Next
Console.WriteLine()
Console.ReadLine()
End Sub
''' <summary>
''' 簡單測試及顯示型別的NestedTypes
''' </summary>
''' <param name="type">型別 (即Type) 物件</param>
Private Sub ShowGetNestedTypes(type As Type)
Console.WriteLine("取得型別NestedTypes")
For Each gnt As Type In type.GetNestedTypes
Console.WriteLine("{0}", gnt.Name)
Next
Console.WriteLine()
Console.ReadLine()
End Sub
''' <summary>
''' 簡單測試及顯示型別 GetMembers() 方法
''' </summary>
''' <param name="type">型別 (即Type) 物件</param>
Private Sub ShowGetMembers(type As Type)
Console.WriteLine("取得型別Members")
For Each mi As MemberInfo In type.GetMembers()
Console.WriteLine(" Member的 Type 及 名稱")
Console.WriteLine(" {0}:{1}", mi.MemberType, mi.Name)
ShowMemberType(mi)
Next
Console.WriteLine()
Console.ReadLine()
End Sub
''' <summary>
''' 簡單測試及顯示MemberInfo裡MemberType成員,目前只讓 ShowGetMembers 呼叫
''' </summary>
''' <param name="mi">MemberInfo物件</param>
Private Sub ShowMemberType(mi As MemberInfo)
' MemberInfo 可藉由 MemberTypes 來判斷出型別的不同成員,注意,都是public。
' 簡單測試 MemberTypes.Property
Select Case mi.MemberType
Case MemberTypes.Constructor
Case MemberTypes.Custom
Case MemberTypes.Event
Case MemberTypes.Field
Case MemberTypes.Method
Case MemberTypes.NestedType
Case MemberTypes.Property
Dim pi As PropertyInfo = CType(mi, PropertyInfo)
Console.WriteLine(" Property Type: {0}", pi.PropertyType.Name)
Case MemberTypes.TypeInfo
Case MemberTypes.All
Case Else
Console.WriteLine("什麼!完全沒有符合的成員!")
End Select
End Sub
''' <summary>
''' 簡單測試及顯示型別 GetConstructors 方法
''' </summary>
''' <param name="type">型別 (即Type) 物件</param>
Sub ShowGetConstructors(type As Type)
Console.WriteLine("取得型別Constructors")
For Each ci As ConstructorInfo In type.GetConstructors
Console.WriteLine(" IsSecuritySafeCritical: {0}", ci.IsSecuritySafeCritical)
Next
Console.WriteLine()
Console.ReadLine()
End Sub
''' <summary>
''' 簡單測試及顯示型別 GetEvents 方法
''' </summary>
''' <param name="type">型別 (即Type) 物件</param>
Sub ShowGetEvent(type As Type)
Console.WriteLine("取得型別Events")
For Each ei As EventInfo In type.GetEvents
Console.WriteLine(" DeclaringType: {0}", ei.DeclaringType)
Next
Console.WriteLine()
Console.ReadLine()
End Sub
''' <summary>
''' 簡單測試及顯示型別 GetFields 方法
''' </summary>
''' <param name="type">型別 (即Type) 物件</param>
Sub ShowGetFields(type As Type)
Console.WriteLine("取得型別Fields")
For Each fi As FieldInfo In type.GetFields
Console.WriteLine(" FieldType: {0}", fi.FieldType)
Next
Console.WriteLine()
Console.ReadLine()
End Sub
''' <summary>
''' 簡單測試及顯示型別 GetMethods 方法
''' </summary>
''' <param name="type">型別 (即Type) 物件</param>
Sub ShowGetMethods(type As Type)
Console.WriteLine("取得型別Methods")
For Each mi As MethodInfo In type.GetMethods
Console.WriteLine("Method: {0}, IsPublic: {1}", mi.GetBaseDefinition.Name, mi.IsPublic)
Next
Console.WriteLine()
Console.ReadLine()
End Sub
#End Region
- 顯示型別屬性,ShowGetProperties(type) --> PropertyInfo
- 顯示型別巢狀型別,ShowGetNestedTypes(type) --> Type
- 顯示型別成員,ShowGetMembers(type) --> MemberInfo
- 顯示型別建構子,ShowGetConstructors(type) --> ConstructorInfo
- 顯示型別事件,ShowGetEvent(type) --> EventInfo
- 顯示型別欄位,ShowGetFields(type) --> FieldInfo
- 顯示型別方法,ShowGetMethods(type) --> MethodInfo
不知道你有沒有發現,在以上 7 支副程式中,我們都是使用 Info 結尾的類別(除NestedTypes)來接收型別傳過來的資訊。再回去看看以上副程式,雖然很多,但其實動作都是一樣的。你想要「屬性」資訊,那就用 PropertyInfo 來接收資訊,每個你想要的資訊內容都一個對應的 *Info 類別( 請參考 Reflection 類別 ),記住這一點,那以上的副程式看起來比會簡單許多。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。