Передача переменного числа параметров универсального типа - PullRequest
4 голосов
/ 03 апреля 2012

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

List<HistoryBook> HistoryBooks = something;
List<MathBook> MathBooks = something;
List<ScienceBook> ScienceBooks = something;

ExcelExporter.Export(FileName, HistoryBooks, MathBooks, ScienceBooks);

Я думал о чем-то вроде приведенного ниже кода, но в этом случае я должен привести все к«Список объектов» - это не то, что я хочу.

public void Export(string FileName, params List<object>[] Data)

Можете ли вы дать мне подсказку, как решить это элегантно?

Ответы [ 3 ]

4 голосов
/ 03 апреля 2012

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

public void Export(string FileName, params IList[] Data)

Все List<T> объекты также реализуют IListкак обобщенный IList<T>, так что вы можете применять его.

На самом деле, в зависимости от того, что вам нужно делать с этими списками в Экспортере, возможно, вам достаточно применения IEnumerable, если все, что вам нужно, этофункциональность только для чтения.

Лучший способ решить - определить, какие общие функциональные возможности вам нужны для всех параметров, и определить сигнатуру вашего метода для реализации этой функциональности.

ОБНОВЛЕНИЕ

Исходя из вашего комментария, кажется, что вы хотите, возможно в C # 4.0, используя ковариантные / контравариантные дженерики, а это означает, что дженерик ISomething<out object> может получить ISomething<string>.Проблема в том, что IList<T> не определяет ковариантный универсальный параметр, поэтому передача IList<string> для IList<object> не работает.

Однако, IList<T> наследует IEnumerable<out T>, что определяетковариантный параметр.Поэтому, если ваш Export метод получает параметр params IEnumerable<object>[] data, вы ДОЛЖНЫ иметь возможность передавать его в любой IList<T> файл.

4 голосов
/ 03 апреля 2012
class Book {}

class ScienceBook : Book {}

class MathBook : Book  {}

class ScienceBook : Book {}

public void Export(string FileName, IList<Book> Data)

или вы можете использовать интерфейс для этого. например интерфейс IBook {}

1 голос
/ 03 апреля 2012
   public interface IBook {}

   public class ScienceBook : IBook {} 
   public class MathBook: IBook {}
   public class HistoryBook: IBook {}

    class Main()
    {
      List<IBook> hbook = new List<HistoryBook>();
      List<IBook> mbook = new List<MathBook>();
      List<IBook> sbook = new List<ScienceBook> ();

      public void Export(string FileName, List<IBook> Data)


    }
...