Проверка, наследуется ли универсальный тип от универсального интерфейса - PullRequest
0 голосов
/ 31 января 2019

У меня есть базовый интерфейс, IResponse ...

public interface IResponse
{
    int CurrentPage { get; set; }
    int PageCount { get; set; }
}

... универсальный интерфейс, ICollectionResponse, который наследуется от базового интерфейса ...

public interface ICollectionResponse<T> : IResponse
{
    List<T> Collection { get; set; }
}

.... и класс EmployeesResponse, который наследуется от универсального интерфейса и, следовательно, от базового интерфейса ...

public class EmployeesResponse : ICollectionResponse<Employee>
{
    public int CurrentPage { get; set; }
    public int PageCount { get; set; }
    public List<Employee> Collection { get; set; }
}

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Моя проблема здесь.У меня есть общий метод задачи, который возвращает экземпляр базового интерфейса, IResponse.Внутри этого метода мне нужно определить, реализует ли T из ICollectionResponse.

public class Api
{
    public async Task<IResponse> GetAsync<T>(string param)
    {
        // **If T implements ICollectionResponse<>, do something**

        return default(IResponse);
    }
}

Я безуспешно пробовал все версии метода IsAssignableFrom (), в том числе:

typeof(ICollectionResponse<>).IsAssignableFrom(typeof(T))

IЦеню любые отзывы.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Поскольку у вас нет экземпляра T, необходимо использовать отражение.

if (typeof(T).GetInterfaces().Any(
  i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(ICollectionResponse<>)))
{
  Console.WriteLine($"Do something for {param}");
}

IsGenericType используется для поиска любого универсального интерфейса - в этом примере он отфильтровывает IReponse, которыйтакже возвращается GetInterfaces().

Затем GetGenericTypeDefinition перемещается из ICollectionResponse<Employee> в ICollectionResponse<>, который является типом, который мы хотим проверить.Поскольку мы не знаем, что такое Employee.

Как указано в комментариях, может быть реализовано несколько интерфейсов, например ICollectionResponse<Employee>, ICollectionResponse<Person>.Приведенный выше код запускает оператор Do Something и не заботится о том, есть ли одно совпадение или много.Не могу сказать, если это проблема или нет, не зная больше о сфере.

0 голосов
/ 01 февраля 2019

Это у вас работает?

List<bool> list = new List<bool>();

foreach (var i in list.GetType().GetInterfaces())
{
  if (i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IList<>))
  { }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...