【发布时间】:2018-05-31 12:07:31
【问题描述】:
我正在开展一个项目,该项目将从提供的数据生成 Excel 文件。 Book 类有多个Sheet 类,每个Sheet 类包含一个对象列表。但是,不同的工作表可能具有不同类型的数据。
即第一张可能是List<Dog>,第二张可能是List<Planet>。
这个想法是从 EF 获取不同的结果集,创建一本新书,为每个结果集添加一个工作表,然后让应用程序创建 Excel 文件。
使用泛型(我很陌生)给我带来了一些问题。
public class Book
{
public List<Sheet> Sheets { get; set; }
}
public class Sheet
{
public string Name { get; set; }
public List<T> Data { get; set; }
}
这不起作用,因为“找不到T”,所以我换了表格
public class Sheet<T>
{
public string Name { get; set; }
public List<T> Data { get; set; }
}
但是 Book 需要了解 T,这使得我的 Sheet 列表只有一种类型。
我尝试了接口路由,并将这两个属性添加到接口,但这(再次)导致我不得不提供 T。
public interface ISheet
{
string Name { get; set; }
List<T> Data { get; set; }
}
我确信我遗漏了一些明显的东西,而且我把它弄得太复杂了。
谢谢
[编辑:在一个示例中,我使用了'List<Book>',但我意识到这很混乱,所以我将其更改为'List<Planet>']
【问题讨论】:
-
奇怪的问题 => Dog 和 Book 有什么共同点吗?
-
类型系统和您遇到的错误正试图将您从自己手中拯救出来。即使您的第一次尝试
Book和Sheet成功了,您也无法编写 type safe 代码来迭代Sheets并访问每个Data属性。 -
假设你得到了这个工作,你希望如何在代码中使用它? (或另一种说法,达米安所说的!)
-
@CodeNotFound,不。它们可以是任何东西。
-
基本上,当您创作通用代码时,您不知道要使用什么类型,但能够应用约束。当您使用泛型代码(编写使用现有泛型类型/方法的代码)时,您确实需要知道您正在使用的具体类型(除非您的代码本身就是通用的)。您正在尝试使用泛型类,但仍然不知道具体类型并且您自己不能是泛型的。
标签: c# generics collections