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 IsSubclassOf(TypeDefinition thisTypeDefinition, TypeDefinition typeDefinition, IEmitter emitter) { if (thisTypeDefinition.BaseType != null) { TypeDefinition baseTypeDefinition = null; try { baseTypeDefinition = Helpers.ToTypeDefinition(thisTypeDefinition.BaseType, emitter); } catch { } if (baseTypeDefinition != null) { return(baseTypeDefinition == typeDefinition || Helpers.IsSubclassOf(baseTypeDefinition, typeDefinition, emitter)); } } 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))); }