首页 > 解决方案 > 任何类型的集合

问题描述

我正在开发一个项目,该项目将从提供的数据中生成一个 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>']

标签: c#genericscollections

解决方案


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


推荐阅读