具体来说,我想编写一个可以像这样使用的导出函数:
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 接口(interface):
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>
你想要的。
关于c# - 传递可变数量的泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9988302/