我有一个DTO课程:
public class MyDto {...}
和扩展我类的通用验证器的验证器:
public class MyDtoValidator: AbstractValidator<MyDto>
在我的代码中,我知道MyDto的类型(并且可以根据需要创建实例)。基于此类型,是否可以使用反射来获取MyDtoValidator的类型?我知道验证程序所在的程序集和确切的名称空间,如果有帮助的话。我意识到可以从AbstractValidator<MyDto>
继承任何类型的类型,但是就我而言,总是会有一个类型,因此即使我得到一个列表,我也会得到一个类型的列表。
如果我在课程结束时贴上“ Validator”(可能最终不得不这样做),就可以通过类名找到它,但是我试图限制对命名约定和字符串连接的依赖。
答案 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;
}
}
}