Отражение, чтобы получить, если у класса есть интерфейс, который "реализует" другой интерфейс - PullRequest
0 голосов
/ 28 мая 2018

В настоящее время я пытаюсь добиться следующего:

У меня есть интерфейс с этим интерфейсом:

public interface IRepository<TEntity>
{
   //Some Methods
}

Затем у меня есть другой интерфейс, который расширяет тот, что указан выше:

public interface IAttractionRepository : IRepository<Attraction>
{
   //More methods
}

Наконец, у меня есть реализация (которая также реализует другие интерфейсы):

public class AttractionRepository : ISomethingElse, IAnotherSomethingElse, IAttractionRepository
{
  //Implementations and methods
}

То, что я пытаюсь достичь, это: Предоставленный тип AttractionRepository, я хочу найти его интерфейсы и получить какойрасширяет интерфейс IRepository.

Мой код выглядит следующим образом:

Type[] interfaces = typeof(AttractionRepository).GetInterfaces(); //I get three interfaces here, which is fine.
Type iface = null;

foreach (Type t in interfaces) //Iterate through all interfaces
    foreach(Type t1 in t.GetInterfaces()) //For each of the interfaces an interface is extending, I want to know if there's any interface that is "IRepository<Attraction>"
        if (t1.IsSubclassOf(typeof(IRepository<>).MakeGenericType(typeof(Attraction)))) //Always false
            iface = t;

Я пробовал несколько других решений, но безуспешно.

1 Ответ

0 голосов
/ 28 мая 2018

Что-то вроде этого очень удобно для этой ситуации:

/// <summary>
/// Returns whether or not the specified class or interface type implements the specified interface.
/// </summary>
/// <param name="implementor">The class or interface that might implement the interface.</param>
/// <param name="interfaceType">The interface to look for.</param>
/// <returns><b>true</b> if the interface is supported, <b>false</b> if it is not.</returns>
public static bool ImplementsInterface(this Type implementor, Type interfaceType)
{
    if (interfaceType.IsGenericTypeDefinition)
    {
        return (implementor.IsGenericType && implementor.GetGenericTypeDefinition() == interfaceType) ||
            (implementor.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == interfaceType));
    }
    else return interfaceType.IsAssignableFrom(implementor);
}

Проблема в том, что для этого нет встроенной функции из-за того, что интерфейс, который вы ищетеявляется универсальным интерфейсом.

В вашем конкретном случае вы бы использовали его примерно так:

Type implementingInterface = typeof(AttractionRepository).GetInterfaces().Where(i => i.ImplementsInterface(typeof(IRepository<>))).FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...