📄 genericmethoddescriptor.vb
字号:
Else result = m_ClosedType End If DumpMethodInfo(result) Helper.Assert(result IsNot Nothing) Return result End Get End Property Public Overrides Function GetParameters() As System.Reflection.ParameterInfo() Static result As ParameterInfo() If result Is Nothing Then If m_OpenMethodDescriptor IsNot Nothing Then result = Helper.GetParameters(Me.Parent.Compiler, m_OpenMethodDescriptor) Else result = Helper.GetParameters(Me.Parent.Compiler, m_OpenMethod) End If result = Helper.ApplyTypeArguments(Me.Parent, result, m_TypeParameters, m_TypeArguments) End If DumpMethodInfo(result) Return result End Function Public Overrides ReadOnly Property MethodInReflection() As System.Reflection.MethodInfo Get If m_ClosedMethod Is Nothing Then#If EXTENDEDDEBUG Then Console.WriteLine("GenericMethodDescriptor.MethodInReflection: " & DeclaringType.FullName & "." & Me.Name)#End If Try If m_ClosedType Is Nothing Then#If EXTENDEDDEBUG Then Console.WriteLine(">m_ClosedType = Nothing")#End If 'Generic method with arguments. m_OpenMethod = Helper.GetMethodOrMethodBuilder(m_OpenMethod) m_TypeArguments = Helper.GetTypeOrTypeBuilders(m_TypeArguments) m_ClosedMethod = m_OpenMethod.MakeGenericMethod(m_TypeArguments)#If EXTENDEDDEBUG Then Console.WriteLine(">m_OpenMethod = " & m_OpenMethod.Name) Console.WriteLine(">m_TypeArguments.Count = " & m_TypeArguments.Length.ToString) Console.WriteLine(">m_ClosedMethod = " & m_ClosedMethod.Name)#End If Else#If EXTENDEDDEBUG Then Console.WriteLine(">m_ClosedType <> Nothing")#End If 'Method on a generic type. m_ClosedType = Helper.GetTypeOrTypeBuilder(m_ClosedType) m_OpenMethod = Helper.GetMethodOrMethodBuilder(m_OpenMethod) m_TypeArguments = Helper.GetTypeOrTypeBuilders(m_TypeArguments)#If EXTENDEDDEBUG Then Console.WriteLine(">m_ClosedType = " & m_ClosedType.Name) Console.WriteLine(">m_ClosedType.GetType = " & m_ClosedType.GetType.FullName) Console.WriteLine(">m_OpenMethod = " & m_OpenMethod.Name) Console.WriteLine(">m_OpenMethod.GetType = " & m_OpenMethod.GetType.FullName) Console.WriteLine(">m_TypeArguments.Count = " & m_TypeArguments.Length.ToString) For i As Integer = 0 To m_TypeArguments.Length - 1 Console.WriteLine(">Arg#" & i.ToString & ".Fullname = " & m_TypeArguments(i).FullName & "; .GetType.Fullname = " & m_TypeArguments(i).GetType.FullName) Next#End If Dim paramTypes As Type() paramTypes = Helper.GetTypes(GetParameters()) paramTypes = Helper.GetTypeOrTypeBuilders(paramTypes) Dim isGetMethod As Boolean = False Dim isMakeGenericMethod As Boolean = False Dim isTypeBuilderGetMethod As Boolean = False Dim isOpenMethod As Boolean = False Dim isGetMethodDefinitionAndThenTypeBuilder As Boolean = False Dim isMethodOnTypeBuilderInstantiation As Boolean = m_OpenMethod.GetType.Name = "MethodOnTypeBuilderInstantiation" 'OrElse m_OpenMethod.GetType.Name = "MonoMethod" Dim isMethodBuilder As Boolean = TypeOf m_OpenMethod Is MethodBuilder Dim isMethodBuilderOrInstantiation As Boolean = isMethodBuilder Or isMethodOnTypeBuilderInstantiation Dim isTypeInstantiation As Boolean = m_ClosedType.GetType.Name = "TypeBuilderInstantiation" OrElse m_ClosedType.GetType.Name = "MonoGenericClass" Dim isTypeBuilder As Boolean = TypeOf m_ClosedType Is TypeBuilder Dim isTypeBuilderOrInstantiation As Boolean = isTypeBuilder Or isTypeInstantiation Dim methodHasGenericParameters As Boolean = isMethodBuilder = False AndAlso (isMethodOnTypeBuilderInstantiation = False OrElse m_OpenMethod.GetGenericMethodDefinition.GetType.Name <> "MethodBuilder") AndAlso m_OpenMethod.ContainsGenericParameters Dim methodIsGeneric As Boolean = m_OpenMethod.IsGenericMethod Dim methodIsGenericDefinition As Boolean = m_OpenMethod.IsGenericMethodDefinition Dim methodDeclaringTypeIsGenericDefinition As Boolean = m_OpenMethod.DeclaringType.IsGenericTypeDefinition Dim typeHasGenericParameters As Boolean = m_ClosedType.ContainsGenericParameters Dim typeIsGenericDefinition As Boolean = m_ClosedType.IsGenericTypeDefinition Dim typeIsGenericType As Boolean = m_ClosedType.IsGenericType#If EXTENDEDDEBUG Then Console.WriteLine(">isMethodOnTypeBuilderInstantiation: " & isMethodOnTypeBuilderInstantiation) Console.WriteLine(">isMethodBuilder: " & isMethodBuilder) Console.WriteLine(">isMethodBuilderOrInstantiation: " & isMethodBuilderOrInstantiation) Console.WriteLine(">isTypeInstantiation: " & isTypeInstantiation) Console.WriteLine(">isTypeBuilder: " & isTypeBuilder) Console.WriteLine(">isTypeBuilderOrInstantiation: " & isTypeBuilderOrInstantiation) Console.WriteLine(">methodHasGenericParameters: " & methodHasGenericParameters) Console.WriteLine(">methodIsGeneric: " & methodIsGeneric) Console.WriteLine(">methodIsGenericDefinition: " & methodIsGenericDefinition) Console.WriteLine(">methodDeclaringTypeIsGenericDefinition: " & methodDeclaringTypeIsGenericDefinition) Console.WriteLine(">typeHasGenericParameters: " & typeHasGenericParameters) Console.WriteLine(">typeIsGenericDefinition: " & typeIsGenericDefinition) Console.WriteLine(">typeIsGenericType: " & typeIsGenericType)#End If If Helper.IsOnMono AndAlso typeIsGenericType AndAlso methodHasGenericParameters AndAlso methodDeclaringTypeIsGenericDefinition Then#If EXTENDEDDEBUG Then Console.WriteLine(">#0")#End If isTypeBuilderGetMethod = True ElseIf isTypeInstantiation AndAlso typeIsGenericType AndAlso typeIsGenericDefinition = False AndAlso isTypeBuilderOrInstantiation AndAlso methodIsGeneric = False AndAlso methodIsGenericDefinition = False AndAlso methodHasGenericParameters = False AndAlso isMethodOnTypeBuilderInstantiation = False Then#If EXTENDEDDEBUG Then Console.WriteLine(">#1")#End If isTypeBuilderGetMethod = True ElseIf isTypeBuilderOrInstantiation = False Then#If EXTENDEDDEBUG Then Console.WriteLine(">#2")#End If isGetMethod = True ElseIf methodIsGenericDefinition Then#If EXTENDEDDEBUG Then Console.WriteLine(">#3")#End If isMakeGenericMethod = True ElseIf methodIsGeneric Then#If EXTENDEDDEBUG Then Console.WriteLine(">#4")#End If isGetMethod = True ElseIf methodHasGenericParameters AndAlso (typeIsGenericDefinition OrElse (isTypeInstantiation And isMethodOnTypeBuilderInstantiation = False)) Then#If EXTENDEDDEBUG Then Console.WriteLine(">#5")#End If isTypeBuilderGetMethod = True ElseIf Helper.CompareType(m_OpenMethod.DeclaringType, m_ClosedType) = False AndAlso methodHasGenericParameters = True Then#If EXTENDEDDEBUG Then Console.WriteLine(">#6")#End If isGetMethodDefinitionAndThenTypeBuilder = True ElseIf Helper.CompareType(m_OpenMethod.DeclaringType, m_ClosedType) = False AndAlso methodIsGenericDefinition = False Then#If EXTENDEDDEBUG Then Console.WriteLine(">#7")#End If isGetMethodDefinitionAndThenTypeBuilder = True Else#If EXTENDEDDEBUG Then Console.WriteLine(">#8")#End If isOpenMethod = True End If Helper.Assert(isGetMethod Xor isMakeGenericMethod Xor isTypeBuilderGetMethod Xor isOpenMethod Xor isGetMethodDefinitionAndThenTypeBuilder) If isGetMethod Then#If EXTENDEDDEBUG Then Console.WriteLine(">isGetMethod")#End If m_ClosedMethod = m_ClosedType.GetMethod(m_OpenMethod.Name, BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance, Nothing, CallingConventions.Standard, paramTypes, Nothing) ElseIf isOpenMethod Then#If EXTENDEDDEBUG Then Console.WriteLine(">isOpenMethod")#End If m_ClosedMethod = m_OpenMethod ElseIf isMakeGenericMethod Then#If EXTENDEDDEBUG Then Console.WriteLine(">isMakeGenericMethod")#End If m_ClosedMethod = m_OpenMethod.MakeGenericMethod(m_TypeArguments) ElseIf isTypeBuilderGetMethod Then#If EXTENDEDDEBUG Then Console.WriteLine(">isTypeBuilderGetMethod")#End If m_ClosedMethod = TypeBuilder.GetMethod(m_ClosedType, m_OpenMethod) ElseIf isGetMethodDefinitionAndThenTypeBuilder Then#If EXTENDEDDEBUG Then Console.WriteLine(">isGetMethodDefinitionAndThenTypeBuilder")#End If m_ClosedMethod = TypeBuilder.GetMethod(m_ClosedType, m_OpenMethod.GetGenericMethodDefinition) Else Helper.NotImplemented() End If End If Compiler.TypeManager.RegisterReflectionMember(m_ClosedMethod, Me) Catch ex As Exception Parent.Compiler.ShowExceptionInfo(ex) Helper.StopIfDebugging() Throw End Try End If Helper.Assert(m_ClosedMethod IsNot Nothing) Return m_ClosedMethod End Get End PropertyEnd Class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -