出于某种原因,我的老板喜欢创建自定义类型来表示通用列表(即使在他的自定义类型没有成员的大多数情况下!我认为他只是懒惰而且不喜欢键入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;
....
}
答案 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中,而不是从它派生。