private AnalysisNet.Types.IMethodReference ExtractNonGenericInstanceMethod(Cecil.MethodReference methodref) { AnalysisNet.Types.IType extractedType = ExtractType(methodref.DeclaringType); AnalysisNet.Types.IBasicType containingType; if (extractedType is AnalysisNet.Types.ArrayType arrayType) { containingType = new FakeArrayType(arrayType); } else { containingType = (AnalysisNet.Types.IBasicType)extractedType; } AnalysisNet.Types.MethodReference method = new AnalysisNet.Types.MethodReference(methodref.Name, AnalysisNet.Types.PlatformType.Void); genericParameterExtractor.MapGenericParameters(methodref, method); method.ReturnType = ExtractType(methodref.ReturnType); ExtractParameters(method.Parameters, methodref.Parameters); method.GenericParameterCount = methodref.GenericParameters.Count(); method.ContainingType = containingType; method.IsStatic = !(methodref.HasThis || methodref.ExplicitThis); method.Resolve(host); return(method); }
public AnalysisNet.Types.IMethodReference ExtractMethod(Cecil.MethodReference methodReference) { return(performanceCache.GetOrCreate(methodReference, (cacheEntry) => { if (methodReference is Cecil.GenericInstanceMethod instanceMethod) { List <AnalysisNet.Types.IType> genericArguments = new List <AnalysisNet.Types.IType>(); foreach (Cecil.TypeReference typeParameterref in instanceMethod.GenericArguments) { AnalysisNet.Types.IType typeArgumentref = ExtractType(typeParameterref); genericArguments.Add(typeArgumentref); } AnalysisNet.Types.IMethodReference method = ExtractMethod(instanceMethod.GetElementMethod()); AnalysisNet.Types.MethodReference instantiatedMethod = AnalysisNet.Extensions.Instantiate(method, genericArguments); instantiatedMethod.Resolve(host); return instantiatedMethod; } else { return ExtractNonGenericInstanceMethod(methodReference); } })); }