2014-12-04 35 views
1

我正在調整一個與車輛旅程相關的庫,這個問題的目的是有兩個對象。我碰巧用vb可以,但是這是非常無關緊要的討論,除了我可以表達在下面的文本仿製藥沒有編輯吃尖括號如何從一個具體實現投射到.NET中的一個接口

首先是實現一個接口ITRIP跳閘對象。第二個是實現接口IHop的Hop對象。 Trip和Hop對象都具有不屬於接口一部分的功能,但在內部邏輯中使用。

的ITRIP接口有一個只讀屬性,所謂的路線,這是一個IList

(的IHOP)我想要實現內部與(中合)的列表,產生的原因是,旅行對象邏輯需要使用Friend函數來調整Hop的內容。

我有困難提供一種實現路由屬性的代碼,因爲我不能(顯然)從物體到其界面鑄造。這是可能的,如果是的話如何?

+0

從「跳躍」到「IHop」的投射是微不足道的,也是隱含的 - 它不需要任何語法(儘管*有*顯式語法,如果你願意的話)。我懷疑你是什麼*** ***居然試圖做的是投了'名單'/'IList的'的'名單'/'的IList '。我會說得對嗎?這是一個非常* *不同的問題... – 2014-12-04 08:01:40

+0

@MarcGravell我想演員名單到IList的,至少那個版本是給我一個運行時錯誤,當我嘗試它。 – akc42 2014-12-04 08:05:24

回答

2

Hop投射到IHop是微不足道的一個隱式 - 無需語法。同樣,從List<Hop>轉換爲IList<Hop>也是微不足道的。

但是,你不能簡單地投下List<Hop>List<IHop>(或IList<...>),因爲它們互不兼容。編譯器犯錯誤阻止你:一個List<Hop>只能包含Hop S(或Hop子類) - 然而,List<IHop>可以包含我的隨機SomeClass : IHop。如果該投工作,它將使:

List<Hop> hops = ... 
List<IHop> evil = hops; 
evil.Add(new SomeClass()); // boom! 

class SomeClass : IHop { } // but not a Hop 

基本上,您將需要重新創建不同類型的列表。 ConvertAll可能是使用:

List<Hop> hops = ... 
List<IHop> ihops = hops.ConvertAll(x => (IHop)x); 
// or: IList<IHop> ihops = ... 

您也可以使用(也許更方便,但效率較低):

var ihops = hops.Cast<IHop>().ToList(); 

其他:注意IEnumerable<out T>IReadOnlyList<out T>可以直接投,由於差異:

IReadOnlyList<Hop> hops = ... 
IReadOnlyList<IHop> ihops = hops; // just works 
+0

我使用了ConvertAll,它工作得很好。謝謝 – akc42 2014-12-04 09:02:42

相關問題