2011-04-13 150 views
4

我有一個類,我用來枚舉我的數據庫中的列表。數據庫中的所有表都有自己的具有自己屬性的類,它們都來自DatabaseTableRow。鑄造IEnumerable <Derived> IEnumerable <BaseClass>

public class DatabaseLinkRowsEnumerator<T> : IEnumerator<T>, IEnumerable<T> where T : DatabaseTableRow 

我有一個用戶類,它派生自派生自DatabaseTableRow的Page。然後我有一個屬性返回一個DatabaseLinkRowsEnumerator,一個用戶列表。

我也有一個UI函數,顯示水平列表中的任何頁面的列表,包括圖像,名稱和鏈接。

protected string GetVerticalListModuleHtml(IEnumerable<Page> pages) 

現在我想要做的就是將DatabaseLinkRowsEnumerator的值傳遞給此函數。用戶從Page派生,DatabaseLinkRowsEnumerator是一個IEnumerator。即使在我嘗試投射時,出現以下錯誤:

Unable to cast object of type 'Database.DatabaseLinkRowsEnumerator`1[Database.User]' to type 'System.Collections.Generic.IEnumerable`1[Database.Page]'. 

我正在使用ASP.NET 2.0。有沒有人有任何想法如何轉換/轉換而不做每個副本?

回答

12

使用.NET 2.0,這是略有尷尬,但不要太用力:

public static IEnumerable<TBase> Cast<TDerived, TBase> 
    (IEnumerable<TDerived> source) 
    where TDerived : TBase 
{ 
    foreach (TDerived item in source) 
    { 
     yield return item; 
    } 
} 

這樣稱呼它:

IEnumerable<Page> pages = UtilityClass.Cast<User, Page>(users); 

這將懶洋洋地評價它。在LINQ更容易 - 您使用Cast擴展方法:

var baseSequence = derivedSequence.Cast<BaseClass>(); 

在.NET 4中,IEnumerable<T>是協在T所以有一個引用類型轉換,從IEnumerable<DerivedClass>IEnumerable<BaseClass>已經:)

+0

如果繼承設置正確,但在OP的帖子中,我確實沒有看到DatabaseTableRow和Page之間的關係。 – 2011-04-13 20:02:25

+0

@Justin,OP說,Page派生自DatabaseTableRow – 2011-04-13 20:04:35

+0

雖然我在這裏稍微有一點困惑,但是你會把這個方法放在哪裏? – Connell 2011-04-13 20:17:35

4

你可以這樣做:

DatabaseLinkRowsEnumerator<User> users = ... 
IEnumerable<Page> = users.Cast<Page>(); 

編輯:Cast擴展方法沒有在.NET 2.0可用。相反,您可以將Jon Skeet的實現用作普通的靜態方法。如果你使用的是VS2008,你也可以使用LinqBridge,它允許你在面向.NET 2.0時使用Linq到對象。

+0

是不是Enumerable.Cast <>()在.NET 3.5中引入的LINQ方法? – adamjford 2011-04-13 20:02:22

+1

@adamjford,是的,看我的編輯 – 2011-04-13 20:03:13

相關問題