c# - 任何类型的集合
问题描述
我正在开发一个项目,该项目将从提供的数据中生成一个 Excel 文件。该类Book
有多个Sheet
类,每个Sheet
类都包含一个对象列表。但是,不同的工作表可能具有不同类型的数据。
即第一张可能是 a List<Dog>
,第二张可能是 a 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>
']
解决方案
You have to combine Generic with inheritance a simple solution may be:
public class Book
{
public List<Sheet> Sheets { get; set; }
}
//Use sheet as a base class for specific Sheet
public abstract class Sheet
{
public string Name { get; set; }
public abstract IList Data { get; }
}
//Use the generic class to unify sheet management
public class SheetTyped<T> : Sheet
{
private List<T> _data { get; set; }
public override IList Data { get { return _data; } }
public SheetTyped(string sheetName, List<T> lData)
{
_data = lData;
Name = sheetName;
}
}
Of course you must use at least one factory method that knows the type of sheet to create and looks like to:
public class Dog {
string Name;
public Dog(string name) { Name = name ; }
}
public class Cat {
string Name;
public Cat(string name) { Name = name ; }
}
public class test
{
public Book MyBook ;
public SheetTyped<Dog> AllMyDog ;
public SheetTyped<Cat> AllMycat ;
public void MyTest()
{
Dog[] InitDogs = { new Dog("Fuffy")
, new Dog("Puffy")
, new Dog("Alex") };
Cat[] InitCats = { new Cat("Romeo")
, new Cat("July")
, new Cat("Briciola") };
List<Dog> MyDogList = new List<Dog>(InitDogs);
List<Cat> MyCatList = new List<Cat>(InitCats);
AllMyDog = new SheetTyped<Dog>( "My dogs", MyDogList ) ;
AllMycat = new SheetTyped<Cat>( "My cats", MyCatList ) ;
MyBook = new Book() ;
MyBook.Sheets = new List<Sheet>(2);
MyBook.Sheets[0] = AllMyDog ;
MyBook.Sheets[1] = AllMycat ;
}
}
I think that works. Let me know if it's useful for you. Bye
推荐阅读
- dialogflow-es - 无法从 google dialogflow web hook 调用外部 api?
- android - Android Studio 调色板/组件树
- tweepy - 如何使用 Tweepy 向我之前的推文列表添加另一个具有扩展功能的推文列表?
- redis - 2 zrange 之间的 Redis zinterstore
- python - 如何从 twisted.enterprise.adbapi 而不是“延迟”对象中获取数据
- python - 字典不会更新特定值,而是在所有位置返回相同的值
- indexing - 使用了奇怪的 MySQL 索引
- c# - 摆脱递归方法
- rest - 在 Spring MVC 中为每个 HTTP Rest 调用连接到不同的数据库
- javascript - 离开语音频道