将通用列表转换为从列表派生的类

Chr*_*old 7 c#

我创建了一个派生自List的类.但是,当我尝试将类转换为另一个List对象时,我收到运行时错误.我的代码类似于下面发布的代码:

public class CategoryObj
{
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }
    public string Description { get; set; }
}

public class CategoryObjCollection:List<CategoryObj>
{

}

public void Test()
{
        CategoryObjCollection cat = new CategoryObjCollection();
        using (NWDataContext db = new NWDataContext())
        {
            var qry = (from c in db.Categories
                       select new CategoryObj
                       {
                           CategoryID = c.CategoryID,
                           CategoryName = c.CategoryName,
                           Description = c.Description
                       }).ToList();
            cat = (CategoryObjCollection)qry; //runtime error Unable to cast object of type 'System.Collections.Generic.List`1[WindowsFormsApplication1.CategoryObj]' to type 'WindowsFormsApplication1.CategoryObjCollection'.
        }
}
Run Code Online (Sandbox Code Playgroud)

我希望有人可以帮助我.谢谢.

Jon*_*eet 12

你为什么期望能够施展?该对象不是.的实例CategoryObjCollection.引用类型转换(当它们实际转换而不是调用显式转换时)是告诉编译器您认为对象的执行时间类型实际上与您指定的类型兼容,因此您可以使用特定类型(执行时间测试后).在这种情况下,ToList扩展方法只是创建一个新的List<T>.

更重要的是,你的CategoryObjCollection类型首先要达到什么目的?如果它具有除正常列表之外的任何状态,那么在LINQ查询之后,您希望该状态来自何处?如果它没有任何其他状态,它真的会增加任何好处吗?也许你的类型实际上应该包含一个列表而不是从中派生出来?然后,您可以使用查询结果创建该类型的新实例.

一般来说,它通常是一种设计气味List<T>.它并没有提供很多方法来专门化它的"列表"(不像,比方说Collection<T>).这通常表明你应该考虑构图而不是继承.


Ita*_*aro 6

试试这个

public class CategoryObjCollection:List<CategoryObj>
{
   public CategoryObjCollection(IEnumerable<CategoryObj> items) : base(items){}
}


cat = new CategoryObjCollection(qry);
Run Code Online (Sandbox Code Playgroud)