c# - 传递可变数量的泛型类型参数

标签 c# generics parameters contravariance covariant

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

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/

相关文章:

c - C 函数中的数组参数 & 返回什么类型?

oracle plsql : retrieve runtime parameter values when you call a procedure

c# - 如何分配全局初始化事件?

c# - 如何使用属性名称和前缀从属性方面调用特定方法?

c# - 解析Json字符串并根据C#中的属性排序

java - Java 中 <?> 标记的含义是什么?

c# - 如何将功能按键 (F1..F12) 发送到 .NET 中的控制台应用程序

java - 类型不兼容错误。发现需要 java.lang.Object :Item

c# - 在 C# 中初始化一个 Generic.List

java - java中将方法作为参数传递