繁体   English   中英

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

[英]Passing a variable number of generic type parameters

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

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)

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

class Book {}

class ScienceBook : Book {}

class MathBook : Book  {}

class ScienceBook : Book {}

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

或者你可以使用它的接口。 例如界面IBook {}

如果,如您所说,您希望能够传递完全不相关的列表,也许您应该接受基本的IList接口:

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

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

实际上,根据您在Exporter中对这些列表的需求,如果您只需要只进行一次性读取操作,则强制执行IEnumerable就足够了。

决定的最佳方法是确定所有参数所需的共享功能,并定义方法签名以强制执行该功能。

UPDATE

基于您的评论,您似乎可以在C#4.0中使用covariant / contravariant泛型,这意味着通用的ISomething<out object>可以接收ISomething<string> 问题是IList<T>没有定义协变泛型参数,因此为IList<object>传递IList<string>不起作用。

但是, IList<T>继承了IEnumerable<out T> ,它定义了一个协变参数。 因此,如果您的Export方法收到一个params IEnumerable<object>[] data参数,您应该能够将任何IList<T>传递给它。

   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)


    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM