2015-10-15 28 views
-1

我有一個實現枚舉的接口,以及我到iCLASS的代碼或收集無訪問,因爲它是我建立在一個庫中的程度的接口

foreach(IClass i in collection) 
{ 

} 

行的東西。現在我想添加屬性到IClass。我一直在努力爲

public class IClassExt : IClass 
{ 
    ... IClass properties 
    ... additional properties 
} 

但現在我無法弄清楚如何獲得IClassExt當我打電話

foreach(IClassExt i in collection) 
{ 
} 

我試圖從iCLASS非強制轉換爲IClassExt但既不允許即使它工作了,如果我每次使用循環都必須這樣做,那將太耗時了。我需要能夠將所有IClass實現爲IClassExt一次,並使我的集合成爲IClassExt集合而不是IClass集合。

+1

你能詳細說明「耗時」嗎?它是多麼耗時? –

+1

如果您正在執行'foreach(集合中的IClass i)'',那麼'IClass'接口不會實現一個枚舉器。無論什麼類型的'集合',它實現IEnumerable ' –

+0

@Thomas Weller:我正在考慮嘗試類似foreach(集合中的IClass i){IclassExt =(IClassExt)我......然後用i}做些事情。但是這意味着我每次使用循環時都必須分配額外的屬性。 –

回答

0

見,如果這個工程:

var iClassCollection = collection.Select(c=> (ICollectionExt)c).ToList(); 

foreach(IClassExt i in iClassCollection) 
{ 
    // ... 
} 
+1

這使得'collection'中的所有實例的類型都是'ICollectionExt'。 – AWinkle

1

可以使用OfType <> LINQ的擴展方法得到的IClassExt實例中collection。這允許IClassIClassExt實例駐留在同一個集合中。

實例類和接口設置

public interface IClass{ 
    string ClassName {get;set;} 
    bool IsValid {get;set;} 
} 
public interface IClassExt:IClass{ 
    string SuperiorClassName {get;set;} 
} 
public class Foo: IClass{ 
    public string ClassName {get;set;} 
    public bool IsValid {get;set;} 
} 
public class Bar: IClassExt{ 
    public string ClassName {get;set;} 
    public bool IsValid {get;set;} 
    public string SuperiorClassName {get;set;} 
} 

用法:

var collection = new IClass[]{new Foo{ClassName = "MyFooClass", IsValid=true}, new Bar{ClassName="MyBarClass", IsValid=false, SuperiorClassName = "MySuperiorFooBarClass"}}; 
foreach (IClassExt classExt in collection.OfType<IClassExt>()){ 
    //Do something really cool here 
} 
0

幽州如下:

我到iCLASS的代碼或收集無訪問,因爲它是在我正在建設的圖書館裏。

但後來:

我需要能夠實現我的所有iCLASS作爲IClassExt一次,讓我收集IClassExt集合,而不是一個集合的iCLASS。

如果您沒有該集合的源代碼,那麼您不能將它作爲IClassExt的集合。它將始終是IClass的集合,但COULD包含IClassExt,這與List可以包含字符串(或其他任何從對象繼承的內容)的方式相同。但是,假設集合中的所有內容都是IClassExt是不安全的,因爲儘管你可以保證每個IClassExt也是一個IClass,但你不能保證每個IClass都是一個IClassExt,即使你親自用這種方式編寫了所有的代碼,您不能確定接下來要處理代碼的人不會決定將其他IClass對象放入集合中。這意味着,爲了安全地進行編碼,您必須測試集合中的對象是否爲IClassExt。

使用其他答案中引用的「OfType」擴展方法是確保訪問集合時安全的好方法。另一種可能性是使用包裝類來插入和訪問集合。

在我看來,最好的選擇就是創建自己的IClassExt集合,然後使用它。涉及到更改所有代碼以使用IClassExt而不是IClass的工作是在構建應用程序時需要解決的問題。