如何在自己的代码中模拟(单个参数)重载解析规则?

时间:2019-07-08 14:53:52

标签: c# .net .net-core

我有一个任意的对象实例,它可以实现接口和/或从​​类型层次结构继承。

我有一组工人(由DI注入),它们接受单个输入参数。

我既可以简化为单个输入System.Type,也可以简化为System.Type数组作为候选。

是否存在一些框架代码(或者Roslyn NuGet包中的函数),它们应用与重载解析相同的规则,并且返回给定集合的匹配类型或模棱两可的异常?

例如,如果我的实例的类型为DirectoryInfo,则可以使用为FileSystemInfo设计的工作程序(DirectoryInfo的基类),但前提是不是{{1 }}类型存在。

我当然可以沿用BaseTypes层次结构,但是我也想考虑接口(包括co(ntra)方差)。我真的不想重新发明轮子,然后让其他开发人员感到沮丧,因为我创建了自己的个人规则集。

1 个答案:

答案 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<>)。