public AnalysisNet.Types.IType ExtractType(Cecil.TypeReference typeReference) { return(performanceCache.GetOrCreate(typeReference, (cacheEntry) => { AnalysisNet.Types.IType result = null; if (typeReference is Cecil.ArrayType arrayType) { result = ExtractType(arrayType); } else if (typeReference is Cecil.ByReferenceType byReferenceType) { result = ExtractType(byReferenceType); } else if (typeReference is Cecil.PointerType pointerType) { result = ExtractType(pointerType); } else if (typeReference is Cecil.GenericParameter genericParameterType) { result = ExtractType(genericParameterType); } else if (typeReference is Cecil.FunctionPointerType functionPointerType) { result = ExtractType(functionPointerType); } else if (typeReference is Cecil.GenericInstanceType genericInstanceType) { result = ExtractType(genericInstanceType); } else { // named type reference result = ExtractNonGenericInstanceType(typeReference); } if (result is AnalysisNet.Types.BasicType) { AnalysisNet.Types.BasicType basicType = result as AnalysisNet.Types.BasicType; basicType.Resolve(host); if (basicType.GenericType is AnalysisNet.Types.BasicType) { basicType = basicType.GenericType as AnalysisNet.Types.BasicType; basicType.Resolve(host); } } return result; })); }
private AnalysisNet.Types.IType ExtractType(Cecil.GenericInstanceType typeref) { AnalysisNet.Types.BasicType genericTyperef = (AnalysisNet.Types.BasicType)ExtractType(typeref.ElementType); AnalysisNet.Types.IType[] arguments = typeref.GenericArguments.Select(argumentref => ExtractType(argumentref)).ToArray(); AnalysisNet.Types.BasicType instancedType = AnalysisNet.Extensions.Instantiate(genericTyperef, arguments); instancedType.Resolve(host); return(instancedType); }