#眉標=.NET Namespace專欄 #副標= System.NET #大標=動態處理作業的基石- System.Reflection #作者=文/彭靖灝 ==========程式=========== 程式 1 Reflector類別 Imports System.Reflection Public Class Reflector Private Shared _Result As ArrayList Public Shared Function ReflectOnAssembly (ByVal assem As Assembly) As ArrayList _Result = New ArrayList WriteResultLine(0, "Assembly: {0}", assem) Dim m As [Module] For Each m In assem.GetModules WriteResultLine(1, "Module: {0}", m) Dim t As Type For Each t In m.GetTypes WriteResultLine(2, "Type: {0}", t) Dim mi As MemberInfo For Each mi In t.GetMembers WriteResultLine (3, "{0}: {1}", mi.MemberType, mi) Next Next Next Return _Result End Function Private Shared Sub WriteResultLine(ByVal indent As Int32, _ ByVal format As String, ByVal ParamArray args() As Object) _Result.Add(New String (" "c, 4 * indent) & System.String.Format(format, args)) End Sub End Class ==========程式=========== ==========程式=========== 程式 2 叫用 Reflector類別的Windows 主程式 Private Sub btnReflection_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnReflection.Click Dim assem As Assembly = Assembly.GetExecutingAssembly Dim result As ArrayList Dim sb As New StringBuilder result = Reflector.ReflectOnAssembly(assem) txtResult.Text = "" For Each s As String In result sb.AppendLine(s) Next txtResult.Text = sb.ToString End Sub ==========程式=========== ==========程式=========== 程式 3 取得應用程式領域中的所有組件資料 Private Sub btnAppDomain_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAppDomain.Click Dim assem As Assembly Dim result As ArrayList Dim sb As New StringBuilder For Each assem In AppDomain. CurrentDomain.GetAssemblies result = Reflector.ReflectOnAssembly(assem) For Each s As String In result sb.AppendLine(s) Next Next txtResult.Text = sb.ToString End Sub ==========程式=========== ==========程式=========== 程式4 Dim bf As BindingFlags = BindingFlags.DeclaredOnly Or _ BindingFlags.NonPublic Or BindingFlags.Public _ BindingFlags.Instance Or BindingFlags.Static Dim mi As MemberInfo For Each mi In t.GetMembers(bf) WriteResultLine(3, "{0}: {1}", mi.MemberType, mi) Next ==========程式=========== ==========程式=========== 程式 5 動態載入特定組件 Private Sub LoadAssemblies() Dim AssemblyNames() As String = { _ "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken={0}", "System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken={1}"} Dim EcmaPublicKeyToken As String = "b77a5c561934e089" Dim MSPublicKeyToken As String = "b03f5f7f11d50a3a" Dim str As String For Each str In AssemblyNames Dim AssemIdentity As String = _ String.Format (str, EcmaPublicKeyToken, MSPublicKeyToken) Assembly.Load(AssemIdentity) Next End Sub ==========程式=========== ==========程式=========== GetType(System.Object).Assembly.GetName.Version ==========程式=========== ==========程式=========== 程式 6 用來叫用指定的物件方法 Imports System.Reflection Public Class MethodInvoker Public Shared Function Invoke(ByVal Obj As Object, ByVal MethodName As String, ByVal args As ArrayList) As Object Dim ObjType As Type = Obj.GetType Dim mi As MethodInfo mi = ObjType.GetMethod(MethodName, BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.Static Or _ BindingFlags.InvokeMethod) If mi Is Nothing Then Throw New ApplicationException( String.Format ("MethodInvoker: {1} 類型的{0} 方法不存在。", MethodName, ObjType.ToString)) End If Dim TempArgs(args.Count - 1) As Object args.CopyTo(TempArgs) Return mi.Invoke(Obj, TempArgs) End Function End Class ==========程式=========== 有