传递数量可变的泛型类型参数

本文关键字:泛型类型参数 | 更新日期: 2023-09-27 18:29:44

具体来说,我想写一个导出函数,我可以这样使用:

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)

你能给我一个如何优雅地解决这个问题的提示吗?

传递数量可变的泛型类型参数

如果你想传递完全不相关的列表,也许你应该接受基本的IList接口:

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

所有List<T>对象都实现IList,以及通用IList<T>,因此您可以强制执行。

事实上,根据您需要在Exporter中对这些列表做什么,如果您所需要的只是转发只读一次功能,那么强制执行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>

class Book {}
class ScienceBook : Book {}
class MathBook : Book  {}
class ScienceBook : Book {}
public void Export(string FileName, IList<Book> Data)

或者你可以使用接口。例如。接口IBook{}

   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)

    }