C# 无法强制转换类型为';System.Collections.Generic.List`1[项目]和#x27;输入';项目列表';

C# 无法强制转换类型为';System.Collections.Generic.List`1[项目]和#x27;输入';项目列表';,c#,C#,出于某种原因,我的老板喜欢创建自定义类型来表示泛型列表(即使在大多数情况下,他的自定义类型没有成员!我认为他只是很懒,不喜欢键入列表之类的东西,但对我来说,这很蹩脚,而且对于下面的问题来说,这让我很头疼 举例说明: public class ItemnList : List<Item> { public Personalization FindById(int id) { ...blahblah blah, this is really an exte

出于某种原因,我的老板喜欢创建自定义类型来表示泛型列表(即使在大多数情况下,他的自定义类型没有成员!我认为他只是很懒,不喜欢键入列表之类的东西,但对我来说,这很蹩脚,而且对于下面的问题来说,这让我很头疼

举例说明:

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

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

因为,您不能使用ToList()和cast,但是您可以创建自己的扩展方法来从序列创建派生类型的实例:

public static TDerived CreateFromEnumerable<TDerived, T>(this IEnumerable<T> seq) where TDerived : List<T>, new()
        {
            TDerived outList = new TDerived();
            outList.AddRange(seq);
            return outList;
        }
public static TDerived CreateFromEnumerable(此IEnumerable seq),其中TDerived:List,new()
{
TDerived outList=新的TDerived();
outList.AddRange(序号);
返回最长时间;
}
因此,对于您的示例,您可以这样做:

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

这里的问题到底是什么?我得到的错误是…在后标题示例中,这是在Winforms中进行绑定所必需的。如果你想使用设计器,你必须有一个特定的类。这在使用第三方控件(如Infragustics)时特别方便。我觉得奇怪,因为
ItemnList
(原文如此)是从<代码>列表派生出来的,你不能从后者转换到前者。我完全希望它能为我自己的抽象类工作,当然它也落在了一个大堆中。(因此,我为什么在这里。)将列表封装在ItemList中是什么意思?你所说的“普通列表”是什么意思…一个IEnumerable?我给出这个答案是因为它超出了我的理解,所以这是一个解释“推断”解决方案的好例子。我还不是通用方法的大师。
ItemList outList = itemList
    .Where(x => x.ItemType != ItemType.Car && x.ItemType != ItemType.Truck)
    .CreateFromEnumerable<ItemList, Item>();