helper.vb
来自「大名鼎鼎的mono是.NET平台的跨平台(支持linux」· VB 代码 · 共 1,554 行 · 第 1/5 页
VB
1,554 行
Shared Function GetInstanceConstructors(ByVal type As Type) As Generic.List(Of MemberInfo) Dim result As New Generic.List(Of MemberInfo) result.AddRange(type.GetConstructors(BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.DeclaredOnly)) Return result End Function ''' <summary> ''' Removes private members if they are from an external assembly. ''' </summary> ''' <param name="Members"></param> ''' <returns></returns> ''' <remarks></remarks> Shared Function FilterExternalInaccessible(ByVal Compiler As Compiler, ByVal Members As Generic.List(Of MemberInfo)) As Generic.List(Of MemberInfo) Dim result As New Generic.List(Of MemberInfo) For i As Integer = 0 To Members.Count - 1 Dim member As MemberInfo = Members(i) If (IsPrivate(member) OrElse IsFriend(member)) AndAlso Compiler.Assembly.IsDefinedHere(member.DeclaringType) = False Then Continue For End If result.Add(member) Next Return result End Function Shared Function IsProtectedOrAssem(ByVal Member As MemberInfo) As Boolean Helper.Assert(Member IsNot Nothing) Select Case Member.MemberType Case MemberTypes.Constructor Dim ctor As ConstructorInfo = DirectCast(Member, ConstructorInfo) Return ctor.IsFamilyOrAssembly Case MemberTypes.Event Dim eventM As EventInfo = DirectCast(Member, EventInfo) Return CBool(Helper.GetEventAccess(eventM) = MethodAttributes.FamORAssem) Case MemberTypes.Field Dim field As FieldInfo = DirectCast(Member, FieldInfo) Return field.IsFamilyOrAssembly Case MemberTypes.NestedType Dim tp As Type = DirectCast(Member, Type) Return tp.IsNestedFamORAssem Case MemberTypes.Method Dim method As MethodInfo = DirectCast(Member, MethodInfo) Return method.IsFamilyOrAssembly OrElse method.IsFamily Case MemberTypes.Property Dim propM As PropertyInfo = DirectCast(Member, PropertyInfo) Return Helper.GetPropertyAccess(propM) = MethodAttributes.FamORAssem Case MemberTypes.TypeInfo Dim tp As Type = DirectCast(Member, Type) Return tp.IsNotPublic OrElse tp.IsNested AndAlso tp.IsNestedFamORAssem Case Else Throw New InternalException("") End Select End Function Shared Function IsFriend(ByVal Member As MemberInfo) As Boolean Helper.Assert(Member IsNot Nothing) Select Case Member.MemberType Case MemberTypes.Constructor Return DirectCast(Member, ConstructorInfo).IsAssembly Case MemberTypes.Event Dim eventM As EventInfo = DirectCast(Member, EventInfo) Return CBool(Helper.GetEventAccess(eventM) = MethodAttributes.Assembly) Case MemberTypes.Field Return DirectCast(Member, FieldInfo).IsAssembly Case MemberTypes.NestedType Return DirectCast(Member, Type).IsNestedAssembly Case MemberTypes.Method Return DirectCast(Member, MethodInfo).IsAssembly Case MemberTypes.Property Dim propM As PropertyInfo = DirectCast(Member, PropertyInfo) Return Helper.GetPropertyAccess(propM) = MethodAttributes.Assembly Case MemberTypes.TypeInfo Dim tp As Type = DirectCast(Member, Type) Return tp.IsNotPublic OrElse tp.IsNested AndAlso tp.IsNestedAssembly Case Else Throw New InternalException("") End Select End Function Shared Function IsPrivate(ByVal Member As MemberInfo) As Boolean Select Case Member.MemberType Case MemberTypes.Constructor Return DirectCast(Member, ConstructorInfo).IsPrivate Case MemberTypes.Event Dim eventM As EventInfo = DirectCast(Member, EventInfo) Return CBool(Helper.GetEventAccess(eventM) = MethodAttributes.Private) Case MemberTypes.Field Return DirectCast(Member, FieldInfo).IsPrivate Case MemberTypes.NestedType Return DirectCast(Member, Type).IsNestedPrivate Case MemberTypes.Method Return DirectCast(Member, MethodInfo).IsPrivate Case MemberTypes.Property Dim pInfo As PropertyInfo = DirectCast(Member, PropertyInfo) Return Helper.GetPropertyAccess(pInfo) = MethodAttributes.Private Case MemberTypes.TypeInfo Dim tp As Type = DirectCast(Member, Type) Return tp.IsNested AndAlso tp.IsNestedPrivate Case Else Throw New InternalException("") End Select End Function Shared Function IsPublic(ByVal Member As MemberInfo) As Boolean Select Case Member.MemberType Case MemberTypes.Constructor Return DirectCast(Member, ConstructorInfo).IsPublic Case MemberTypes.Event Dim eventM As EventInfo = DirectCast(Member, EventInfo) Return CBool(Helper.GetEventAccess(eventM) = MethodAttributes.Public) Case MemberTypes.Field Return DirectCast(Member, FieldInfo).IsPublic Case MemberTypes.Method Return DirectCast(Member, MethodInfo).IsPublic Case MemberTypes.Property Dim pInfo As PropertyInfo = DirectCast(Member, PropertyInfo) Return Helper.GetPropertyAccess(pInfo) = MethodAttributes.Public Case MemberTypes.TypeInfo, MemberTypes.NestedType Dim tp As Type = DirectCast(Member, Type) Return tp.IsPublic OrElse (tp.IsNested AndAlso tp.IsNestedPublic) Case Else Throw New InternalException("") End Select End Function Shared Function FilterByTypeArguments(ByVal Members As Generic.List(Of MemberInfo), ByVal TypeArguments As TypeArgumentList) As Generic.List(Of MemberInfo) Dim result As New Generic.List(Of MemberInfo) Dim argCount As Integer If TypeArguments IsNot Nothing Then argCount = TypeArguments.Count For i As Integer = 0 To Members.Count - 1 Dim member As MemberInfo = Members(i) Dim minfo As MethodInfo = TryCast(member, MethodInfo) If minfo IsNot Nothing Then If minfo.GetGenericArguments.Length = argCount Then If argCount > 0 Then member = TypeArguments.Parent.Compiler.TypeManager.MakeGenericMethod(TypeArguments.Parent, minfo, minfo.GetGenericArguments, TypeArguments.AsTypeArray) result.Add(member) Else result.Add(member) End If Else 'Helper.StopIfDebugging() End If Else result.Add(member) End If Next Return result End Function <Obsolete()> Shared Function FilterByName(ByVal members() As MemberInfo, ByVal Name As String) As Generic.List(Of MemberInfo) Dim result As New Generic.List(Of MemberInfo) Helper.AssertNotNothing(members) For Each member As MemberInfo In members If NameResolution.CompareName(member.Name, Name) Then result.Add(member) Next Return result End Function Shared Function FilterByName(ByVal members() As PropertyInfo, ByVal Name As String) As Generic.List(Of PropertyInfo) Dim result As New Generic.List(Of PropertyInfo) Helper.AssertNotNothing(members) For Each member As PropertyInfo In members If NameResolution.CompareName(member.Name, Name) Then result.Add(member) Next Return result End Function Shared Function FilterByName2(ByVal Members As Generic.List(Of MemberInfo), ByVal Name As String) As Generic.List(Of MemberInfo) Dim result As New Generic.List(Of MemberInfo) For Each member As MemberInfo In Members If NameResolution.CompareName(member.Name, Name) Then result.Add(member) Next Return result End Function Shared Function FilterByName(ByVal collection As ICollection, ByVal Name As String) As ArrayList Dim result As New ArrayList Dim tmpname As String = "" For Each obj As Object In collection If TypeOf obj Is INameable Then tmpname = DirectCast(obj, INameable).Name ElseIf TypeOf obj Is MemberInfo Then tmpname = DirectCast(obj, MemberInfo).Name Else Helper.NotImplemented() End If If NameResolution.CompareName(Name, tmpname) Then result.Add(obj) Next Return result End Function Shared Function FilterByName(ByVal collection As Generic.List(Of Type), ByVal Name As String) As Generic.List(Of Type) Dim result As New Generic.List(Of Type) Dim tmpname As String = "" For Each obj As Type In collection If NameResolution.CompareName(Name, obj.Name) Then result.Add(obj) Next Return result End Function Shared Sub FilterByName(ByVal collection As Generic.List(Of Type), ByVal Name As String, ByVal result As Generic.List(Of MemberInfo)) For Each obj As Type In collection If NameResolution.NameCompare(Name, obj.Name) Then result.Add(obj) Next End Sub Shared Sub FilterByName(ByVal collection As TypeDictionary, ByVal Name As String, ByVal result As Generic.List(Of MemberInfo)) For Each obj As Type In collection.Values If NameResolution.NameCompare(Name, obj.Name) Then result.Add(obj) Next End Sub Shared Function FilterByName(ByVal Types As TypeList, ByVal Name As String) As TypeList Dim result As New TypeList For Each obj As Type In Types If NameResolution.CompareName(Name, obj.Name) Then result.Add(obj) Next Return result End Function Shared Function FilterByName(ByVal Types As TypeDictionary, ByVal Name As String) As Type If Types.ContainsKey(Name) Then Return Types(Name) Else Return Nothing End If End Function '''' <summary> '''' Returns a list of type descriptors that only are modules. '''' </summary> '''' <param name="Types"></param> '''' <returns></returns> '''' <remarks></remarks> '<Obsolete()> Shared Function FilterToModules(ByVal Compiler As Compiler, ByVal Types As Generic.List(Of Type)) As Generic.List(Of Type) ' Dim result As New Generic.List(Of Type) ' For Each t As Type In Types ' If IsModule(Compiler, t) Then result.Add(t) ' Next ' Return result 'End Function ''' <summary> ''' Returns a list of type descriptors that only are modules. ''' </summary> ''' <param name="Types"></param> ''' <returns></returns> ''' <remarks></remarks> Shared Function FilterToModules(ByVal Compiler As Compiler, ByVal Types As TypeDictionary) As Generic.List(Of Type) Dim result As New Generic.List(Of Type) For Each t As Type In Types.Values If IsModule(Compiler, t) Then result.Add(t) Next Return result End Function ''' <summary> ''' Finds a non-private, non-shared constructor with no parameters in the array. ''' If nothing found, returns nothing. ''' </summary> ''' <param name="Constructors"></param> ''' <returns></returns> ''' <remarks></remarks> Function GetDefaultConstructor(ByVal Constructors() As ConstructorInfo) As ConstructorInfo For i As Integer = 0 To Constructors.GetUpperBound(0) If HasParameters(Constructors(i)) = False OrElse HasOnlyOptionalParameters(Constructors(i)) Then If Constructors(i).IsStatic = False AndAlso Constructors(i).IsPrivate = False Then Return Constructors(i) End If End If Next Return Nothing End Function Function HasOnlyOptionalParameters(ByVal Constructor As ConstructorInfo) As Boolean Helper.Assert(HasParameters(Constructor)) Return Constructor.GetParameters(0).IsOptional End Function ''' <summary> ''' Returns true if this constructor has any parameter, default or normal parameter. ''' </summary> ''' <param name="Constructor"></param> ''' <returns></returns> ''' <remarks></remarks> Shared Function HasParameters(ByVal Constructor As ConstructorInfo) As Boolean Return Constructor.GetParameters().Length > 0 End Function ''' <summary> ''' Finds a public, non-shared constructor with no parameters of the type. ''' If nothing found, returns nothing. ''' </summary> ''' <param name="tp"></param> ''' <returns></returns> ''' <remarks></remarks> Function GetDefaultConstructor(ByVal tp As Type) As ConstructorInfo Return GetDefaultConstructor(GetConstructors(tp)) End Function
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?