Коллекция любого типа - PullRequest
0 голосов
/ 31 мая 2018

Я работаю над проектом, который сгенерирует файл Excel из представленных данных.Класс Book имеет несколько классов Sheet, и каждый класс Sheet содержит список объектов.Однако на разных листах могут быть разные типы данных.

Т.е. лист 1 может быть List<Dog>, а лист 2 может быть 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 не может быть найден», поэтому я меняю Sheets

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; }
}

Я уверен, что упускаю что-то очевидное, и я делаюэто слишком сложно.

Спасибо

[Edit: в одном примере я использовал 'List<Book>', но я понял, что это сбивает с толку, поэтому я изменил его на 'List<Planet>']

1 Ответ

0 голосов
/ 31 мая 2018

Вам нужно объединить Generic с наследованием, простое решение может быть:

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;
    }
}

Конечно, вы должны использовать хотя бы один фабричный метод, который знает тип создаваемого листа и выглядит следующим образом:

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  ;
    }
}

Я думаю, что это работает.Дайте мне знать, если это будет полезно для вас.Bye

...