/// <summary> /// Resolves the type reference in the specified module. /// </summary> /// <param name="scope">The module where the type reference is resolved.</param> /// <param name="typeRef">The type reference to resolve.</param> /// <returns>The resolved type definition.</returns> public static TypeDefinition TryResolve(this ModuleDefinition scope, TypeReference typeRef) { var matchingTypeRef = typeRef.Clone(); matchingTypeRef.Scope = scope; return scope.MetadataResolver.TryResolve(matchingTypeRef); }
static TypeReference Resolve(TypeReference typeRef, Collection<TypeReference> genTypeContext) { if (!(typeRef is TypeSpecification) && !(typeRef is GenericParameter)) return typeRef; TypeSpecification ret = typeRef.Clone() as TypeSpecification; switch (typeRef.MetadataType) { case MetadataType.RequiredModifier: (ret as RequiredModifierType).ModifierType = Resolve((typeRef as RequiredModifierType).ModifierType, genTypeContext); ret.ElementType = Resolve(ret.ElementType, genTypeContext); break; case MetadataType.OptionalModifier: (ret as OptionalModifierType).ModifierType = Resolve((typeRef as OptionalModifierType).ModifierType, genTypeContext); ret.ElementType = Resolve(ret.ElementType, genTypeContext); break; case MetadataType.Array: case MetadataType.ByReference: case MetadataType.Pinned: case MetadataType.Pointer: ret.ElementType = Resolve(ret.ElementType, genTypeContext); break; case MetadataType.GenericInstance: GenericInstanceType genInst = ret as GenericInstanceType; genInst.GenericArguments.Clear(); foreach (var i in (typeRef as GenericInstanceType).GenericArguments) genInst.GenericArguments.Add(Resolve(i, genTypeContext)); ret.ElementType = Resolve(ret.ElementType, genTypeContext); break; case MetadataType.MVar: return typeRef; case MetadataType.Var: if (genTypeContext == null) throw new InvalidOperationException(); return genTypeContext[(typeRef as GenericParameter).Position]; case MetadataType.FunctionPointer: //not support throw new NotSupportedException(); } return ret; }