Можно ли найти класс .NET, который использует мой класс как универсальный тип? - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть класс DTO:

public class MyDto {...}

и валидатор, расширяющий универсальный валидатор моего класса:

public class MyDtoValidator: AbstractValidator<MyDto>

В моем коде я знаю тип MyDto (и при необходимости могу создать экземпляр). Основываясь на этом типе, возможно ли добраться до типа MyDtoValidator с помощью отражения? Я знаю сборку и точное пространство имен, в котором находится валидатор, если это поможет. Я понимаю, что может быть любое количество типов, которые наследуются от AbstractValidator<MyDto>, но в моем случае всегда будет один, поэтому даже если я получу список, я получу список из одного.

Я могу найти его по имени класса, если я добавлю «Валидатор» в конце моего класса (и мне может потребоваться это сделать), но я пытаюсь ограничить зависимость от соглашений об именах и конкатенации строк.

1 Ответ

2 голосов
/ 06 апреля 2019

Вы можете использовать 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...