2010-06-22 67 views
3

我有這些屬性的類:如何從通用列表中提取派生類型?

public List<CommitmentItem<ITransaction, ITransactionItem>> CommitmentItems; 
public List<CapitalCallCommitmentItem> CapitalCallCommitmentItems; 

CapitalCallCommitmentItem繼承CommitmentItem。我希望CapitalCallCommitmentItems屬性返回類型爲CapitalCallCommitmentItem的所有CommitmentItems。所以,我想這個代碼:

get 
{     
    return CommitmentItems 
     .Where(c => c.GetType() == typeof(CapitalCallCommitmentItem)) 
     .Select(c => (CapitalCallCommitmentItem)c) 
     .ToList(); 
} 

不過,我得到一個錯誤說:

錯誤1無法將類型「Models.CommitmentItem」到「Models.CapitalCallCommitmentItem」

什麼是正確的方式做這個?

+2

問題名稱沒有意義:( – Restuta 2010-06-22 13:51:14

+1

@Restutat - 它是一個通用的問題名稱:P – 2010-06-22 13:54:58

回答

12

使用OfType擴展方法。

return CommitmentItems.OfType<CapitalCallCommitmentItem>().ToList(); 

在你的代碼,雖然你在where子句中的子類型過濾,但它仍然會返回列表的一般類型。 OfType將返回提供的類型的枚舉。

2

請確保它是可兌換/可澆鑄/各種類型。

然後嘗試如
.Cast<T>()
.OfType<T>()

+0

對於OfType它甚至不需要被施放 – Dykam 2010-06-22 13:51:52

+0

我知道,但有點...它應該寧願說「類型「:) – 2010-06-22 13:53:53

1

你上它。以下在我的機器上正常工作。結果列表將List<CapitalCallCommitmentItem>類型:

get 
{     
    return CommitmentItems 
     .Where(c => c is CapitalCallCommitmentItem) 
     .Select(c => c as CapitalCallCommitmentItem) 
     .ToList(); 
} 

更新: ...但是,是的,CommitmentItems.OfType<CapitalCallCommitmentItem>優越。