2012-04-03 4 views
4

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

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) 

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

+2

Действительно ли 'HistoryBook'' MathBook' и 'ScienceBook' наследуются от того же класса, например' Book'? – Candide

+1

Возможно, вы хотите, чтобы книги наследовались от класса «Книга»? – Gene

+1

Да, сделайте классы наследуемыми от книги BaseClass или реализуйте интерфейс под названием Book, а затем параметром метода будет тип BaseClass или тип интерфейса – Marshal

ответ

4

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

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

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

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

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

UPDATE

Основываясь на ваш комментарий, кажется, что вы хотите, это возможно в 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>, который вы хотите.

+0

Это идет в том направлении, которое я хотел. НО. Я хочу - как-то - убедиться, что каждый элемент в IList имеет тот же тип. Вот почему я хотел обеспечить его, используя общий список типов. – Jens

+0

Обновленный ответ с решением, я думаю. –

+0

Спасибо вам большое! Помог мне много! – Jens

4
class Book {} 

class ScienceBook : Book {} 

class MathBook : Book {} 

class ScienceBook : Book {} 

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

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

+1

Спасибо, но они могут быть разными базовыми очками. Я просто хочу удалить случайные списки вещей в эту функцию, и функция использует отражение и атрибут DisplayName для вывода его в файл Excel. – Jens

+0

, то вы можете использовать интерфейс вместо наследования. – weeyoung

+1

Что делать, если я просто хочу пройти Список , Список ??? – Jens

1
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) 


    } 
+0

Что делать, если я хочу экспортировать список - на всякий случай ;-) – Jens

+0

Если случай не ограничивается Общими типами, вы не сможете решить это с помощью одного метода (без особой сложности). Я думаю, что вам может понадобиться перегрузка методов в этом случае. – Marshal

Смежные вопросы