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);
}
}
}