2013-04-05 64 views
0

我有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

回答

2

簡短的回答是沒有。

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

我認爲你有:

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<>接口是(或可以製造)協變,它應該工作。