C#generic cast

时间:2011-07-21 08:04:27

标签: c# generics inheritance

我有一个名为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总是假的

是否有可能检查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属性字段

2 个答案:

答案 0 :(得分:11)

创建非通用基础接口。例如:

public interface IEditor {}

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

然后检查IEditor

答案 1 :(得分:10)

您的问题是一般差异。例如,IList<MemoryStream>不是IList<Stream>

从C#4开始,您可以潜在使您的界面协变,如下所示:

public interface IEditor<out T> where T: SpecialObject

此时,IEditor<Person> 成为IEditor<SpecialObject> - 但只有当您的界面仅在“退出”位置使用T时才会有效

如果这对你来说是可行的,那么它的意图可能比leppie的非通用基础接口更清晰 - 但当协方差不合适时,这是一个很好的选择。