是否可以找到将我的类用作通用类型的.NET类?

时间:2019-04-05 22:07:28

标签: c# generics reflection

我有一个DTO课程:

public class MyDto {...}

和扩展我类的通用验证器的验证器:

public class MyDtoValidator: AbstractValidator<MyDto>

在我的代码中,我知道MyDto的类型(并且可以根据需要创建实例)。基于此类型,是否可以使用反射来获取MyDtoValidator的类型?我知道验证程序所在的程序集和确切的名称空间,如果有帮助的话。我意识到可以从AbstractValidator<MyDto>继承任何类型的类型,但是就我而言,总是会有一个类型,因此即使我得到一个列表,我也会得到一个类型的列表。

如果我在课程结束时贴上“ Validator”(可能最终不得不这样做),就可以通过类名找到它,但是我试图限制对命名约定和字符串连接的依赖。

1 个答案:

答案 0 :(得分:2)

您可以使用linq来过滤程序集的定义类型:

yourValidatorAssembly.DefinedTypes
    .Where(x => x.BaseType?.IsGenericType == true && x.BaseType.GetGenericTypeDefinition() == typeof(AbstractValidator<>))

编辑:如果您需要查看多个级别,请改用此选项:

yourValidatorAssembly.DefinedTypes
    .Where(x => x.GetHierachicalTypes().Any(y => y.IsGenericType && y.GetGenericTypeDefinition() == typeof(AbstractValidator<>)))

public static class TypeExtensions
{
    public static IEnumerable<Type> GetHierachicalTypes(this Type type)
    {
        while (type != null)
        {
            yield return type;
            type = type.BaseType;
        }
    }
}