public static bool IsImplementationOf(TypeDefinition thisTypeDefinition, TypeDefinition interfaceTypeDefinition, IEmitter emitter) { foreach (TypeReference interfaceReference in thisTypeDefinition.Interfaces) { var iref = interfaceReference; if (interfaceReference.IsGenericInstance) { iref = interfaceReference.GetElementType(); } if (iref == interfaceTypeDefinition) { return true; } TypeDefinition interfaceDefinition = null; try { interfaceDefinition = Helpers.ToTypeDefinition(iref, emitter); } catch { } if (interfaceDefinition != null && Helpers.IsImplementationOf(interfaceDefinition, interfaceTypeDefinition, emitter)) { return true; } } return false; }
public static bool HasGenericArgument(GenericInstanceType type, TypeDefinition searchType, IEmitter emitter, bool deep) { foreach (var gArg in type.GenericArguments) { var orig = gArg; var gArgDef = gArg; if (gArgDef.IsGenericInstance) { gArgDef = gArgDef.GetElementType(); } TypeDefinition gTypeDef = null; try { gTypeDef = Helpers.ToTypeDefinition(gArgDef, emitter); } catch { } if (gTypeDef == searchType) { return true; } if (deep && gTypeDef != null && (Helpers.IsSubclassOf(gTypeDef, searchType, emitter) || (searchType.IsInterface && Helpers.IsImplementationOf(gTypeDef, searchType, emitter)))) { return true; } if (orig.IsGenericInstance) { var result = Helpers.HasGenericArgument((GenericInstanceType)orig, searchType, emitter, deep); if (result) { return true; } } } return false; }
public static bool IsImplementationOf(TypeDefinition thisTypeDefinition, TypeDefinition interfaceTypeDefinition, IEmitter emitter) { foreach (TypeReference interfaceReference in thisTypeDefinition.Interfaces) { if (interfaceReference == interfaceTypeDefinition) { return(true); } TypeDefinition interfaceDefinition = null; try { interfaceDefinition = Helpers.ToTypeDefinition(interfaceReference, emitter); } catch { } if (interfaceDefinition != null && Helpers.IsImplementationOf(interfaceDefinition, interfaceTypeDefinition, emitter)) { return(true); } } return(false); }
public static bool IsAssignableFrom(TypeDefinition thisTypeDefinition, TypeDefinition typeDefinition, IEmitter emitter) { return (thisTypeDefinition == typeDefinition || (typeDefinition.IsClass && !typeDefinition.IsValueType && Helpers.IsSubclassOf(typeDefinition, thisTypeDefinition, emitter)) || (typeDefinition.IsInterface && Helpers.IsImplementationOf(typeDefinition, thisTypeDefinition, emitter))); }