c#与通用类型的接口类型进行转换
问题描述:
我有MockRepository
类,它实现了接口IRepository
,我有一个类Technology
,它实现了接口IIdentifiable
。c#与通用类型的接口类型进行转换
我想将一个对象从MockRepository<Technology>
转换为IRepository<IIdentifiable>
,并且在某些操作完成之后再次退出。这可能吗?我的代码编译,但是当我尝试运行它时,我得到一个无效的转换异常。
答
简短的回答是没有。
如果你有一个接口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 {
}
正如你可以看到RandomInterface
和AlternativeInterface
之间没有关系。因此,一个类从RandomInterface
继承不能转换到AlternativeInterface
读动议
更新后备注
如果你想MockRepository传递给需要IRepository你可以做一个函数以下
public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
}
答
我认为你有:
class MockRepository<T> : IRepository<T> // note: same T
{
}
interface IRepository<out X> // note: "out" means covariance in X
{
}
Then beca使用Technology
是IIdentifiable
,协方差表明IRepository<Technology>
也是IRepository<IIdentifiable>
。
因此,如果你的IRepository<>
接口是(或可以制造)协变,它应该工作。
为什么你会想要这样做? – antonijn 2013-04-05 09:24:46
要澄清@antonijn的问题,为什么你需要投这些对象? 'MockRepository'已经是'IRepository'了,所以你可以得到所有'IRepository'功能,'Technology'是'IIdentifiable',所以你也可以实现这个接口。也许如果你告诉我们你是如何使用它们的,以及你想通过这种转换来完成什么,我们可以帮助你更多。 – Artless 2013-04-05 09:29:03
通常情况下,您可以在所有需要投射到“IRepository”的情况下使用'MockRepository ',它不应该先投射。如果还有其他原因需要演示,请提供一些代码来澄清您的问题。 –
Akku
2013-04-05 09:32:17