我有MockRepository
類,它實現了接口IRepository
,我有一個類Technology
,它實現了接口IIdentifiable
。c#與通用類型的接口類型進行轉換
我想將一個對象從MockRepository<Technology>
轉換爲IRepository<IIdentifiable>
,並且在某些操作完成之後再次退出。這可能嗎?我的代碼編譯,但是當我嘗試運行它時,我得到一個無效的轉換異常。
我有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