【问题标题】:c# casting to and from interface types with generic typesc# 与泛型类型的接口类型之间的转换
【发布时间】:2013-03-27 15:33:48
【问题描述】:

我有一个类MockRepository,它实现了接口IRepository,我有一个类Technology,它实现了接口IIdentifiable

我想将一个对象从MockRepository<Technology> 转换为IRepository<IIdentifiable>,并在一些操作完成后再次转换回来。这可能吗?我的代码可以编译,但是当我尝试运行它时,我得到一个无效的强制转换异常。

【问题讨论】:

  • 你为什么要这样做?
  • 为了澄清@antonijn 的问题,为什么需要强制转换这些对象? MockRepository 已经是IRepository,所以你得到了所有的IRepository 功能,而TechnologyIIdentifiable,所以你也得到了那个接口实现。也许如果您向我们展示您是如何使用它们的,以及您试图通过这种转换完成什么,我们可以为您提供更多帮助。
  • 通常你可以使用MockRepository<Technology>在你想转换为IRepository<IIdentifyable>的所有情况下,它应该可以在没有先转换的情况下工作。如果还有其他原因,请提供一些代码来澄清您的问题。
  • 将其作为参数传递给将IRepository<IIdentifiable> 作为参数类型的函数。如果我将参数类型定义为MockRepository<Technology>,那么我不能将它用于实际的存储库对象和我们从存储库获得的其他可识别对象
  • 问题必须包含相关的代码位和完整的错误信息。事实上,很难正确回答。类定义会有所帮助。请记住,通用集合不可互换,因此 构成了两种不同的集合类型。

标签: c# generics interface casting


【解决方案1】:

简短的回答是否定的。

如果您有一个接口IMyInterface<T>,那么编译器将为您使用的每种类型的 T 创建一个新接口并替换 T 的所有值。

举个例子:

我有一个界面:

public interface IMyInterface<T> {
   public T Value {get; set;}
}

我有 2 节课:

public class Foo {}

public class Bar : Foo {}

然后我定义如下

public class Orange : IMyInterface<Foo> {}

public class Banana : IMyInterface<Bar> {}

编译器将使用特定的命名约定自动创建 2 个新接口,我将使用不同的名称来突出它们的不同

public interface RandomInterface {
   Foo Value { get; set; }
}

public interface AlternativeInterface {
   Bar Value { get; set; }
}

public class Orange : RandomInterface {
}

public class Banana : AlternativeInterface {
}

如您所见,RandomInterfaceAlternativeInterface 之间没有关系。所以从RandomInterface继承的类不能转换为AlternativeInterface

阅读问题评论后更新

如果您希望将 MockRepository 传递给需要 IRepository 的函数,您可以执行以下操作

 public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
 }

【讨论】:

    【解决方案2】:

    我认为你有:

    class MockRepository<T> : IRepository<T>  // note: same T
    {
    }
    
    interface IRepository<out X>  // note: "out" means covariance in X
    {
    }
    

    那么因为TechnologyIIdentifiable,协方差得出IRepository&lt;Technology&gt; 也是IRepository&lt;IIdentifiable&gt;

    因此,如果您的 IRepository&lt;&gt; 接口是(或可以制作)协变的,它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      相关资源
      最近更新 更多