gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:53:21 26 4
gpt4 key购买 nike

我创建了一个派生自 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'.
}
}

我希望有人能帮助我解决这个问题。谢谢。

最佳答案

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

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

一般来说,从List<T>衍生出来的通常是一种设计味道.它没有提供很多方法来专门化它的“listiness”(不像,比方说,Collection<T>)。这通常表明您应该考虑组合而不是继承。

关于c# - 将通用列表转换为从列表派生的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3175321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com