📄 typedescriptor.vb
字号:
Helper.Assert(members IsNot Nothing) Helper.Assert(members.Count = 1) Helper.Assert(TypeOf members(0) Is IFieldMember) result = DirectCast(members(0), IFieldMember).FieldDescriptor DumpMethodInfo(result) Return result End Function Public Overloads Overrides Function GetFields(ByVal bindingAttr As System.Reflection.BindingFlags) As System.Reflection.FieldInfo() DumpMethodInfo() Helper.NotImplemented() : Return Nothing End Function Public Overloads Overrides Function GetInterface(ByVal name As String, ByVal ignoreCase As Boolean) As System.Type DumpMethodInfo() Helper.NotImplemented() : Return Nothing End Function Public Overrides Function GetInterfaces() As System.Type() Dim result As New Generic.List(Of Type) Dim tmp As Type() Helper.Assert(m_Declaration IsNot Nothing) tmp = m_Declaration.ImplementedTypes If tmp IsNot Nothing Then result.AddRange(m_Declaration.ImplementedTypes) If Me.BaseType IsNot Nothing Then result.AddRange(Compiler.TypeManager.GetRegisteredType(Me.BaseType).GetInterfaces) End If For i As Integer = 0 To result.Count - 1 tmp = Compiler.TypeManager.GetRegisteredType(result(i)).GetInterfaces For Each iface As Type In tmp If result.Contains(iface) = False Then result.Add(iface) Next Next DumpMethodInfo(result.ToArray) Return result.ToArray End Function Function Filter(ByVal members As Generic.IEnumerable(Of IConstructorMember), ByVal bindingAttr As BindingFlags) As Generic.List(Of ConstructorInfo) DumpMethodInfo() Dim result As New Generic.List(Of ConstructorInfo) For Each member As IConstructorMember In members If IsMatch(member, bindingAttr) Then result.Add(member.ConstructorDescriptor) Next Return result End Function Function Filter(ByVal members As Generic.IEnumerable(Of MemberInfo), ByVal bindingAttr As BindingFlags) As Generic.List(Of MemberInfo) Dim result As New Generic.List(Of MemberInfo) Helper.Assert(members IsNot Nothing) For Each member As MemberInfo In members If IsMatch(member, bindingAttr) Then result.Add(member) Next DumpMethodInfo(result) Return result End Function Private Function Filter(ByVal members As Generic.IEnumerable(Of IMember), ByVal bindingAttr As BindingFlags) As Generic.List(Of MemberInfo) DumpMethodInfo() Dim result As New Generic.List(Of MemberInfo) For Each member As IMember In members If IsMatch(member, bindingAttr) Then result.Add(member.MemberDescriptor) Next Return result End Function Private Function IsMatch(ByVal member As IMember, ByVal bindingAttr As BindingFlags) As Boolean DumpMethodInfo() Dim result As Boolean = False If CBool(bindingAttr And BindingFlags.Public) Then If member.Modifiers.IsPublic Then result = True End If If CBool(bindingAttr And BindingFlags.NonPublic) Then If member.Modifiers.IsPublic = False Then result = True End If If member.IsShared Then If CBool(bindingAttr And BindingFlags.Static) = False Then result = False Else If CBool(bindingAttr And BindingFlags.Instance) = False Then result = False End If#If DEBUG Then Dim tmp As BindingFlags = (Not (BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.Static)) And bindingAttr If CInt(tmp) > 0 Then Helper.NotImplemented("bindingAttr has some value not checked for: " & tmp.ToString) End If#End If Return result End Function Private Function IsMatch(ByVal member As MemberInfo, ByVal bindingAttr As BindingFlags) As Boolean Dim result As Boolean = True Dim includePublic As Boolean = CBool(bindingAttr And BindingFlags.Public) Dim includeNonPublic As Boolean = CBool(bindingAttr And BindingFlags.NonPublic) Dim includeStatic As Boolean = CBool(bindingAttr And BindingFlags.Static) Dim includeInstance As Boolean = CBool(bindingAttr And BindingFlags.Instance) Dim includeFlattenedHierarchy As Boolean = CBool(bindingAttr And BindingFlags.FlattenHierarchy) Dim onlyDeclared As Boolean = CBool(bindingAttr And BindingFlags.DeclaredOnly) If onlyDeclared AndAlso (Helper.CompareType(member.DeclaringType, Me) = False AndAlso (Me.IsGenericType AndAlso Me.IsGenericTypeDefinition = False AndAlso member.DeclaringType.IsGenericTypeDefinition AndAlso Helper.CompareType(member.DeclaringType, Me.GetGenericTypeDefinition)) = False) Then Return False End If If Helper.IsPublic(member) Then If includePublic = False Then result = False Else If includeNonPublic = False Then result = False End If End If If Helper.IsShared(member) Then If includeStatic = False Then result = False Else If includeInstance = False Then result = False End If If includeFlattenedHierarchy Then#If EXTENDEDDEBUG Then Helper.NotImplementedYet("bindingAttr has some value not checked for: " & BindingFlags.FlattenHierarchy.ToString)#End If End If#If DEBUG Then Dim tmp As BindingFlags = (Not (BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.FlattenHierarchy Or BindingFlags.DeclaredOnly)) And bindingAttr If CInt(tmp) > 0 Then Helper.NotImplementedYet("bindingAttr has some value not checked for: " & tmp.ToString) End If#End If Return result End Function Protected Overridable ReadOnly Property AllDeclaredMembers() As Generic.List(Of MemberInfo) Get If m_AllDeclaredMembers Is Nothing Then Helper.Assert(m_Declaration IsNot Nothing) Helper.Assert(m_Declaration.Members IsNot Nothing) m_AllDeclaredMembers = m_Declaration.Members.MemberDeclarations End If Return m_AllDeclaredMembers End Get End Property Protected Overridable ReadOnly Property AllMembers() As Generic.List(Of MemberInfo) Get If m_AllMembers Is Nothing Then Helper.Assert(m_Declaration IsNot Nothing) Helper.Assert(m_Declaration.Members IsNot Nothing) m_AllMembers = m_Declaration.Members.MemberDeclarations Helper.AddMembers(Compiler, Me, m_AllMembers, Helper.GetBaseMembers(Compiler, Me)) End If Return m_AllMembers End Get End Property Private Overloads Function GetMembers(Of T)(ByVal MemberType As MemberTypes, ByVal bindingAttr As System.Reflection.BindingFlags) As Generic.List(Of T) Dim result As Generic.List(Of T) Dim candidates As Generic.List(Of MemberInfo) If (bindingAttr And BindingFlags.DeclaredOnly) = 0 Then Helper.NotImplementedYet("Get* should not be called without DeclaredOnly, if base members are needed call Compiler.TypeManager.GetCache(type).FlattenedMembers") candidates = AllMembers Else candidates = AllDeclaredMembers End If result = New Generic.List(Of T)(candidates.Count) For i As Integer = 0 To candidates.Count - 1 Dim member As MemberInfo member = candidates(i) If member.MemberType <> MemberType Then Continue For If IsMatch(member, bindingAttr) = False Then Continue For result.Add(DirectCast(CObj(member), T)) Next Return result End Function Public Overloads Overrides Function GetMembers(ByVal bindingAttr As System.Reflection.BindingFlags) As System.Reflection.MemberInfo() Dim result As New Generic.List(Of MemberInfo) result = New Generic.List(Of MemberInfo) If (bindingAttr And BindingFlags.DeclaredOnly) = 0 Then Helper.NotImplementedYet("Get* should not be called without DeclaredOnly, if base members are needed call Compiler.TypeManager.GetCache(type).FlattenedMembers") result.AddRange(Filter(AllMembers, bindingAttr).ToArray) Else result.AddRange(Filter(AllDeclaredMembers, bindingAttr).ToArray) End If DumpMethodInfo(result.ToArray) Return result.ToArray End Function Protected Overrides Function GetMethodImpl(ByVal name As String, ByVal bindingAttr As System.Reflection.BindingFlags, ByVal binder As System.Reflection.Binder, ByVal callConvention As System.Reflection.CallingConventions, ByVal types() As System.Type, ByVal modifiers() As System.Reflection.ParameterModifier) As System.Reflection.MethodInfo Dim result As MethodInfo = Nothing Dim allMembers As New Generic.List(Of MemberInfo) allMembers.AddRange(Me.GetMembers(bindingAttr)) allMembers = Helper.FilterByName2(allMembers, name) If types IsNot Nothing Then For Each m As MemberInfo In allMembers Dim mi As MethodInfo = TryCast(m, MethodInfo) If mi IsNot Nothing AndAlso TypeResolution.CompareTypes(Helper.GetTypes(Helper.GetParameters(Compiler, mi)), types) Then result = mi Exit For End If Next ElseIf allMembers.Count = 1 Then result = TryCast(allMembers(0), MethodInfo) Else Helper.NotImplemented() End If DumpMethodInfo(result) Return result End Function Public Overloads Overrides Function GetMethods(ByVal bindingAttr As System.Reflection.BindingFlags) As System.Reflection.MethodInfo() Dim result As New Generic.List(Of MethodInfo) Dim tmp As Generic.List(Of IMethod) tmp = m_Declaration.Members.GetSpecificMembers(Of IMethod)() For Each item As IMethod In tmp Dim inf As MethodInfo = TryCast(item.MethodDescriptor, MethodInfo) If inf IsNot Nothing Then result.Add(inf) End If Next DumpMethodInfo(result.ToArray) Return result.ToArray End Function Public Overloads Overrides Function GetNestedType(ByVal name As String, ByVal bindingAttr As System.Reflection.BindingFlags) As System.Type Dim result As Type = Nothing Dim candidates As Type() = GetNestedTypes(bindingAttr) For Each candidate As Type In candidates If IsMatch(candidate, name, bindingAttr) Then Helper.Assert(result Is Nothing) 'Only one result should be found. result = candidate#If Not DEBUG Then exit for#End If End If Next DumpMethodInfo(result) Return result End Function Public Overloads Overrides Function GetNestedTypes(ByVal bindingAttr As System.Reflection.BindingFlags) As System.Type() Dim result As New Generic.List(Of Type) For Each candidate As TypeDeclaration In m_Declaration.Members.GetSpecificMembers(Of TypeDeclaration)() If IsMatch(candidate.TypeDescriptor, Nothing, bindingAttr) Then result.Add(candidate.TypeDescriptor) Next DumpMethodInfo(result.ToArray) Return result.ToArray End Function Private Function IsMatch(ByVal Type As Type, ByVal SearchedName As String, ByVal bindingAttr As BindingFlags) As Boolean 'The following BindingFlags filter flags can be used to define which nested types to include in the search: '- You must specify either BindingFlags.Instance or BindingFlags.Static in order to get a return. '- Specify BindingFlags.Public to include public nested types in the search. '- Specify BindingFlags.NonPublic to include non-public nested types (that is, private and protected members) in the search. '- Specify BindingFlags.FlattenHierarchy to include static nested types up the hierarchy. 'The following BindingFlags modifier flags can be used to change how the search works: '- BindingFlags.IgnoreCase to ignore the case of name. '- BindingFlags.DeclaredOnly to search only the nested types declared on the Type, not nested types that were simply inherited. 'NOTES: '- What is a static nested type? '- BindingFlags.FlattenHierarchy's info says nested types are NOT returned. '- Could not get the runtimetype to return any inherited nested types, so we are not looking for them eiter. If CBool(bindingAttr And (BindingFlags.Instance Or BindingFlags.Static)) = False Then Return False If Type.IsNotPublic OrElse Type.IsNestedPublic = False Then If CBool(bindingAttr And BindingFlags.NonPublic) = False Then Return False ElseIf Type.IsPublic OrElse Type.IsNestedPublic Then If CBool(bindingAttr And BindingFlags.Public) = False Then Return False End If If SearchedName IsNot Nothing Then If NameResolution.CompareName(Type.Name, SearchedName, Not CBool(bindingAttr And BindingFlags.IgnoreCase)) = False Then Return False End If Return True End Function Public Overloads Overrides Function GetProperties(ByVal bindingAttr As System.Reflection.BindingFlags) As System.Reflection.PropertyInfo() DumpMethodInfo() Helper.NotImplemented() : Return Nothing End Function Protected Overrides Function GetPropertyImpl(ByVal name As String, ByVal bindingAttr As System.Reflection.BindingFlags, ByVal binder As System.Reflection.Binder, ByVal returnType As System.Type, ByVal types() As System.Type, ByVal modifiers() As System.Reflection.ParameterModifier) As System.Reflection.PropertyInfo Dim result As PropertyInfo = Nothing Dim tmp As New Generic.List(Of MemberInfo) tmp.AddRange(Me.GetMembers(bindingAttr)) For Each p As MemberInfo In tmp If p.MemberType = MemberTypes.Property AndAlso NameResolution.CompareName(p.Name, name) Then Helper.Assert(result Is Nothing) result = DirectCast(p, PropertyInfo) End If Next DumpMethodInfo(result) Return result End Function Public Overrides ReadOnly Property GUID() As System.Guid Get DumpMethodInfo() Helper.NotImplemented() : Return Nothing End Get End Property Protected Overrides Function HasElementTypeImpl() As Boolean Dim result As Boolean Helper.NotImplemented() DumpMethodInfo(result) Return result End Function Public Overloads Overrides Function InvokeMember(ByVal name As String, ByVal invokeAttr As System.Reflection.BindingFlags, ByVal binder As System.Reflection.Binder, ByVal target As Object, ByVal args() As Object, ByVal modifiers() As System.Reflection.ParameterModifier, ByVal culture As System.Globalization.CultureInfo, ByVal namedParameters() As String) As Object DumpMethodInfo() Helper.NotImplemented() : Return Nothing End Function Protected Overrides Function IsArrayImpl() As Boolean Dim result As Boolean = False DumpMethodInfo(result) Return result End Function Protected Overrides Function IsByRefImpl() As Boolean Dim result As Boolean = False DumpMethodInfo(result) Return result End Function Protected Overrides Function IsCOMObjectImpl() As Boolean DumpMethodInfo() Helper.NotImplemented() End Function Public Overrides Function IsDefined(ByVal attributeType As System.Type, ByVal inherit As Boolean) As Boolean DumpMethodInfo() Helper.NotImplemented() End Function Protected Overrides Function IsPointerImpl() As Boolean Dim result As Boolean = False DumpMethodInfo(result) Return result End Function Protected Overrides Function IsPrimitiveImpl() As Boolean Dim result As Boolean = False DumpMethodInfo(result) Return result End Function Public Overrides ReadOnly Property [Module]() As System.Reflection.Module
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -