Подтвердить что ты не робот

С# generic cast

У меня есть интерфейс под названием IEditor

public interface IEditor<T> 
    where T: SpecialObject

SpecialObject - абстрактный класс.

Вот моя проблема:

У меня есть класс, который наследует от SpecialObject и представление, которое реализует этот интерфейс IEditor

public class View : IEditor<Person>

Теперь, я должен проверить, реализует ли View IEditor<SpecialObject>

Boolean isEditor = View is IEditor<SpecialObject>

Но IEditor всегда false

Есть ли возможность проверить, является ли View IEditor<SpecialObject>?

Изменить

У меня есть метод, который вызывается, когда возникает событие закрытия. Представления, которые передаются этому методу, могут реализовать IEditor, но они также могут реализовать другой интерфейс. В примере IView

  void Closing(object sender, MyEventArgs e)
  {
      if(e.Item is IView)
      {
          // DO some closing tasks

          if(e.Item is IEditor<SpecialObject>)          // always false
          {
              // Do some special tasks
              var editor = e.Item as IEditor<SpecialObject>;

              var storedEditObect = editor.StoredObject;

              // more tasks
          }
      } else if(e.Item is ISomeOtherView)
      {}
  }

У меня есть классы, называемые Person, Address и т.д. Все они наследуются от SpecialObject. В некотором случае e.Item наследует от IEditor или IEditor Из-за этого мне нужно передать в базовый класс доступ к полям свойств defaut

4b9b3361

Ответ 1

Создайте базовый базовый интерфейс. Например:

public interface IEditor {}

public interface IEditor<T> : IEditor ... {}

Затем проверьте IEditor.

Ответ 2

Ваша проблема - общая дисперсия. Например, IList<MemoryStream> не является IList<Stream>.

Как и на С# 4, вы можете сделать свой ковариантный интерфейс следующим образом:

public interface IEditor<out T> where T: SpecialObject

В этот момент IEditor<Person> будет IEditor<SpecialObject>, но это будет работать, только если ваш интерфейс использует T в позиции "out".

Если это возможно для вас, это, вероятно, более чистое намерение, чем базовый интерфейс leppie non-generic, но это хорошая альтернатива, когда ковариация не подходит.