using System; using System.Collections.Generic; using System.Linq; namespace ET { public static class GenericHelper { /// /// 判断指定的类型 是否是指定泛型类型的子类型,或实现了指定泛型接口。 /// /// 需要测试的类型。 /// 泛型接口类型,传入 typeof(IXxx<>) /// 如果是泛型接口的子类型,则返回 true,否则返回 false。 public static bool HasImplementedRawGeneric(this Type type,Type generic) { if (type == null) throw new ArgumentNullException(nameof(type)); if (generic == null) throw new ArgumentNullException(nameof(generic)); // 测试接口。 bool isTheRawGenericType = type.GetInterfaces().Any(IsTheRawGenericType); if (isTheRawGenericType) return true; // 测试类型。 while (type != null && type != typeof(object)) { isTheRawGenericType = IsTheRawGenericType(type); if (isTheRawGenericType) return true; type = type.BaseType; } // 没有找到任何匹配的接口或类型。 return false; // 测试某个类型是否是指定的原始接口。 bool IsTheRawGenericType(Type test) => generic == (test.IsGenericType ? test.GetGenericTypeDefinition() : test); } } }