在VB中,利⽤反射,获得项⽬中所有公⽤对象的属性、⽅
法、事件等
近⽇,想整理下我⾃⼰的vb应⽤程序中,⾃⼰定义的类、控件、窗体等对象,希望能够获得它们的“属性”、“字段”、“⽅法”、“事件”等名称。查阅了“反射”(Reflection)相关资料,写了以下⼀段代码,分享给朋友们。    当然,由于本⼈的⽔平有限,有些功能还没完善,⽐如“按对象名排序”的问题,⽐如“获得属性、⽅法的参数”的问题,等等。此⽂抛砖引⽟,希望能够得到⼤侠们的指点。
Private Sub GetAssemblyObject(ByVal lAssembly As Reflection.Assembly)
Dim TT1, TT2, TT3 As String  '为输出代码长度,分别代表1、2、3个vbTab
TT1 = vbTab
TT2 = vbTab & vbTab
TT3 = vbTab & vbTab & vbTab
Dim s As String
Dim t, t1() As Type
s = lAssembly.FullName
t1 = lAssembly.GetTypes
'20200312 这⾥有个未解决的问题,就是需要将t1,g1等对象按名称进⾏排序
Try
System.Array.Sort(t1)  '这个是要报错的
Catch ex As Exception
Dim kkk As String = ""
End Try
s = s.Split(",").GetValue(0)
s = "C:\temp\temp_" & s & ".txt"  '保存位置  '⽂本⽂件的读写
Dim oSWrit As System.IO.StreamWriter = System.IO.File.CreateText(s)array在vb什么意思啊
For Each t In t1
s = ""
oSWrit.WriteLine("===================================================")
If t.IsSubclassOf(GetType(System.Windows.Forms.Form)) = True Then
s = "【窗体】"
ElseIf t.IsSubclassOf(GetType(System.Windows.Forms.UserControl)) = True Then
s = "【控件】"
Else
s = "【对象】"
End If
s = "【" & t.FullName & "】" & TT1 & s & TT1 & t.FullName.Replace(t.Name, "") & TT1 & " 继承⾃:" &
t.BaseType.FullName  '要是能够得到⽂件名就好了
oSWrit.WriteLine(s)
'oSWrit.WriteLine("---------------------------------------------------")
'以下获取属性⽅法事件,这种做法有问题:
'得到的信息太多了,多数都是不需要的,如何得到我⾃⼰定义的那些东东呢??
Dim g, g1() As PropertyInfo
Dim e, e1() As EventInfo
Dim f, f1() As FieldInfo
Dim m, m1() As MethodInfo
Dim b, b1() As MemberInfo
f1 = t.GetFields(BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly)      '获取字段
g1 = t.GetProperties(BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly)  '获取属性
m1 = t.GetMethods(BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly)      '获取⽅法
e1 = t.GetEvents(BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly)      '获取事件
b1 = t.GetMembers(BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly)      '获取所有,包括属性、⽅法、字段、事件等
If g1.Length > 0 Then
oSWrit.WriteLine("-----------------属性------GetPropertie------------")
For Each g In g1
s = ""
If g.CanRead = True And g.CanWrite = True Then
s = "读写-  "
ElseIf g.CanRead = True And g.CanWrite = False Then
s = "只读-  "
ElseIf g.CanRead = False And g.CanWrite = True Then
s = "只写-  "
ElseIf g.CanRead = False And g.CanWrite = False Then
s = "不可能"
End If
oSWrit.WriteLine(TT1 & s & g.Name & TT2 & g.PropertyType.ToString & TT3 & t.FullName & "-【属性】")
'g.Name 后⾯加的信息,主要原因是导⼊Excel后,⽅便排序、整理
Next
End If
If e1.Length > 0 Then
oSWrit.WriteLine("-----------------事件------GetEvents  ------------")
For Each e In e1
'oSWrit.WriteLine(TT1 & e.Name & MM(e.Name) & TT2 & e.GetType.ToString & TT3 & t.FullName & "-【事件】")
oSWrit.WriteLine(TT1 & e.Name & e.Name & TT3 & TT3 & t.FullName & "-【事件】")
Next
End If
If m1.Length > 0 Then
oSWrit.WriteLine("-----------------⽅法------GetMethods  ------------")
For Each m In m1
s = TT2 & m.IsAssembly & TT1 & m.IsFamily & TT1 & m.IsFamilyAndAssembly & TT1 &
m.IsFamilyOrAssembly & TT1 & m.IsPrivate & TT1
s &= m.IsPublic & TT1 & m.IsSpecialName & TT1 & m.IsStatic & TT1  '这些是⽅法和字段共同的
s &= m.IsAbstract & TT1 & m.IsConstructor & TT1 & m.IsFinal & TT1 & m.IsHideBySig & TT1 &
m.IsVirtual & TT1
oSWrit.WriteLine(TT1 & m.Name & TT2 & TT3 & t.FullName & "-【⽅法】" & s)
'属性中的set、get⽅法也这⾥罗列出来了,可以判断 m.Name 是否以“set_”“get_”开头,将其屏蔽,不输出。
'⾃定义的事件,也会在这⾥罗列出来, 可以判断 m.Name 是否以“add_”“remove_”开头,将其屏蔽,不输出。                Next
End If
'⽅法和字段共有的:
IsAssembly,IsFamily,IsFamilyAndAssembly,IsFamilyOrAssembly,IsPrivate,IsPublic,IsSpecialName,IsStatic
'⽅法有的:IsAbstract,IsConstructor,IsFinal,IsHideBySig,IsVirtual,
'字段有的:IsInitOnly,IsLiteral,IsNotSerialized,IsPinvokeImpl,
'获得这些值的⽬的是⽅便分析对象属性
If f1.Length > 0 Then
oSWrit.WriteLine(vbCrLf & "-----------------字段------GetFields  ------------")
For Each f In f1
s = TT2 & f.IsAssembly & TT1 & f.IsFamily & TT1 & f.IsFamilyAndAssembly & TT1 &
f.IsFamilyOrAssembly & TT1 & f.IsPrivate & TT1
s &= f.IsPublic & TT1 & f.IsSpecialName & TT1 & f.IsStatic & TT1  '这些是⽅法和字段共同的
s &= TT3 & TT3
s &= f.IsInitOnly & TT1 & f.IsLiteral & TT1 & f.IsNotSerialized & TT1 & f.IsPinvokeImpl & TT1
oSWrit.WriteLine(TT1 & f.Name & TT2 & f.FieldType.ToString & TT3 & t.FullName & "-【字段】" & s)                Next
End If
'以下是 获取所有,包括属性、⽅法、字段、事件等,可以不⽤输出
If b1.Length > 0 Then
oSWrit.WriteLine("-----------------所有------GetMembers  ------------")
For Each b In b1
oSWrit.WriteLine(TT1 & b.Name & TT2 & TT3 & t.FullName & "-【所有】")
Next
End If
oSWrit.WriteLine("===================================================" & vbCrLf & vbCrLf)        Next
oSWrit.WriteLine("------------------------------------结束-")
oSWrit.Close()
End Sub
创建⼀个windows窗体,添加命令按钮,执⾏这段代码就OK了。
调⽤⽅法是:
GetAssemblyObject(Reflection.Assembly.LoadFrom(”bqbass.dll“))  'bqbass.dll 是项⽬⽂件名
⽣成的⽂本⽂件,部分内容截图:
复制到excel,部分内容截图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。