无法将'System.Collections.Generic.List`1 [Item]'类型的对象强制转换为'ItemList'类型

时间:2009-12-10 17:15:42

标签: c#

出于某种原因,我的老板喜欢创建自定义类型来表示通用列表(即使在他的自定义类型没有成员的大多数情况下!我认为他只是懒惰而且不喜欢键入List或者其他东西而是我是蹩脚的,并且在下面的问题上让我感到很头疼。

以防万一:

public class ItemnList : List<Item>
{
    public Personalization FindById(int id)
    {
        ...blahblah blah, this is really an extension method that should be elsewhere
    }

}

因此,当我使用标准List(mabye我讨厌他的自定义类并且喜欢使用普通的.NET类型时应该使用它们),或者我可能正在使用如下所示的LINQ表达式,我总是运行即使自定义类型继承自该List

,也会导致出现问题
private ItemList someMethod(ItemList itemList)
{
    ...
    itemList = (ItemList)items.Where(x => x.ItemType != ItemType.Car && x.ItemType != ItemType.Truck).ToList();

    return itemList;
    ....
}

2 个答案:

答案 0 :(得分:6)

作为Grzenio points out,您不能使用ToList()和强制转换,但是您可以创建自己的扩展方法,以便从序列中创建派生类型的实例:

public static TDerived CreateFromEnumerable<TDerived, T>(this IEnumerable<T> seq) where TDerived : List<T>, new()
        {
            TDerived outList = new TDerived();
            outList.AddRange(seq);
            return outList;
        }

因此,对于您的示例,您可以这样做:

ItemList outList = itemList
    .Where(x => x.ItemType != ItemType.Car && x.ItemType != ItemType.Truck)
    .CreateFromEnumerable<ItemList, Item>();

答案 1 :(得分:2)

不幸的是ToList()将返回一个普通列表,而不是ItemnList,因此你无法强制转换它。我真的没有看到合理的解决方法,最好将List封装在ItemnList中,而不是从它派生。