我有一个任意的对象实例,它可以实现接口和/或从类型层次结构继承。
我有一组工人(由DI注入),它们接受单个输入参数。
我既可以简化为单个输入System.Type
,也可以简化为System.Type
数组作为候选。
是否存在一些框架代码(或者Roslyn NuGet包中的函数),它们应用与重载解析相同的规则,并且返回给定集合的匹配类型或模棱两可的异常?
例如,如果我的实例的类型为DirectoryInfo
,则可以使用为FileSystemInfo
设计的工作程序(DirectoryInfo
的基类),但前提是不是{{1 }}类型存在。
我当然可以沿用BaseTypes层次结构,但是我也想考虑接口(包括co(ntra)方差)。我真的不想重新发明轮子,然后让其他开发人员感到沮丧,因为我创建了自己的个人规则集。
答案 0 :(得分:1)
一组Type
扩展方法,可能对您有用:
public static class TypeExtensions
{
public static bool IsAssignableToType(this Type derivedType, Type baseType)
{
bool retVal = baseType.IsAssignableFrom(derivedType) ||
(baseType.IsGenericType && derivedType.IsAssignableToGenericType(baseType)) ||
(baseType.IsInterface && (Nullable.GetUnderlyingType(derivedType)?.IsAssignableToType(baseType) ?? false));
return retVal;
}
private static bool IsAssignableToGenericType(this Type derivedType, Type genericBaseType)
{
var interfaceTypes = derivedType.GetInterfaces();
foreach (var it in interfaceTypes)
{
if (it.IsGenericType && it.GetGenericTypeDefinition() == genericBaseType)
return true;
}
if (derivedType.IsGenericType && derivedType.GetGenericTypeDefinition() == genericBaseType)
return true;
Type baseType = derivedType.BaseType;
if (baseType == null) return false;
return IsAssignableToGenericType(baseType, genericBaseType);
}
}
然后致电:
var isWorkerSuitableForObj = yourObjectInstance.GetType().IsAssignableToType(yourWorkerType)
这也适用于泛型,甚至适用于泛型开放类型(例如IEnumerable<>
)。