如何从通用列表中提取派生类型?

时间:2010-06-22 13:47:02

标签: c# generics

我有一个包含这些属性的类:

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'

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:12)

使用OfType扩展名方法。

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

在您的代码中,虽然您正在过滤where子句中的子类型,但它仍将返回列表的常规类型。 OfType将返回所提供类型的可枚举。

答案 1 :(得分:2)

确保它是可兑换的/可铸造的/类型。

然后尝试例如
.Cast<T>()
.OfType<T>()

答案 2 :(得分:1)

你正在接受它。以下在我的机器上工作正常。结果列表的类型为List<CapitalCallCommitmentItem>

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

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