Приведение к наследуемому интерфейсу - PullRequest
0 голосов
/ 19 января 2012

Я пытаюсь проверить, является ли что-то интерфейсом, и я не уверен, что делаю это правильно. У меня есть базовый интерфейс, который я хочу проверить:

interface IName
{
  string Name {get;}
}

У меня есть класс, который реализует этот интерфейс:

class Person : IName
{
  public string Name {get;} 
}

У меня тогда есть другой интерфейс:

interface IThing<T>
{
  T Thing {get;}
}

Затем у меня есть другой класс, который реализует IThing:

class Teacher : IThing<Person>
{
  public Person Thing {get;}
}

Что я хочу сделать, это:

Teacher teacher = new Teacher("Math", "John");
if (teacher is IThing<IName>)
{
  Console.WriteLine((teacher as IThing<IName>).Thing.Name);
}

Однако это не работает. Я почти уверен, что не может понять, что IThing<Person> это IThing<IName>. Как мне это сделать? У меня есть несколько классов, которые реализуют IThing<BaseClassThatIsIName>, поэтому я не хочу явно приводить к типу, а скорее к интерфейсу.

Ответы [ 2 ]

1 голос
/ 19 января 2012

Проблема в том, что вы специально пытаетесь увидеть, реализует ли учитель интерфейс IThing<IName>.Однако он не реализует интерфейс IThing<Person>, где Person реализует интерфейс IName.Вы ищете некоторую ковариацию здесь, но способ, которым вы определили интерфейс IThing<>, не допускает этого.Допустим:

interface IThing<out T> // note the "out" in the parameter
{
    T Thing { get; }
}

Теперь интерфейс будет соответствовать точным типам параметров или более общим типам.Вы должны быть в состоянии сделать то, что вы хотите сейчас:

if (teacher is IThing<IName>) // teacher is actually a `IThing<Person>` but
                              // `Person` is an `IName` so we're good
{
    Console.WriteLine((teacher as IThing<IName>).Thing.Name);
}
0 голосов
/ 19 января 2012

Я полагаю, что вы решили проблему с ног на голову, и я не уверен, что есть способ обойти ее, просто используя ключевое слово "is". Однако вы можете использовать рефлексию, чтобы проверить, что 1) универсальный тип учителя, 2) универсальный тип учителя - IThing, 3) универсальный тип учителя имеет один параметр типа и 4) этот первый параметр наследуется от IName.

Прочтите эту документацию , чтобы начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...