c#与通用类型的接口类型进行转换

问题描述:

我有MockRepository类,它实现了接口IRepository,我有一个类Technology,它实现了接口IIdentifiablec#与通用类型的接口类型进行转换

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

+0

为什么你会想要这样做? – antonijn 2013-04-05 09:24:46

+1

要澄清@antonijn的问题,为什么你需要投这些对象? 'MockRepository'已经是'IRepository'了,所以你可以得到所有'IRepository'功能,'Technology'是'IIdentifiable',所以你也可以实现这个接口。也许如果你告诉我们你是如何使用它们的,以及你想通过这种转换来完成什么,我们可以帮助你更多。 – Artless 2013-04-05 09:29:03

+0

通常情况下,您可以在所有需要投射到“IRepository ”的情况下使用'MockRepository ',它不应该先投射。如果还有其他原因需要演示,请提供一些代码来澄清您的问题。 – Akku 2013-04-05 09:32:17

简短的回答是没有。

如果你有一个接口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 { 
} 

我认为你有:

class MockRepository<T> : IRepository<T> // note: same T 
{ 
} 

interface IRepository<out X> // note: "out" means covariance in X 
{ 
} 

Then beca使用TechnologyIIdentifiable,协方差表明IRepository<Technology>也是IRepository<IIdentifiable>

因此,如果你的IRepository<>接口是(或可以制造)协变,它应该工作。