具体来说,我想编写一个导出函数,我可以这样使用:
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)
你能给我一个如何优雅地解决这个问题的提示吗?
答案 0 :(得分:4)
class Book {}
class ScienceBook : Book {}
class MathBook : Book {}
class ScienceBook : Book {}
public void Export(string FileName, IList<Book> Data)
或者您可以使用界面。 例如 接口IBook {}
答案 1 :(得分:4)
如果如您所说,您希望能够传递完全不相关的列表,那么您应该接受基本的IList接口:
public void Export(string FileName, params IList[] Data)
所有List<T>
个对象都会实现IList
以及通用IList<T>
,因此您可以强制执行此操作。
实际上,根据您在导出程序中对这些列表的操作,如果您只需要只进行一次性读取操作,则强制执行IEnumerable
就足够了。
决定的最佳方法是确定所有参数所需的共享功能,并定义方法签名以强制执行该功能。
更新
根据您的评论,您似乎可以在C#4.0中使用covariant / contravariant泛型,这意味着通用ISomething<out object>
可以接收ISomething<string>
。问题是IList<T>
没有定义协变通用参数,因此传递IList<string>
IList<object>
不起作用。
但是,IList<T>
继承了IEnumerable<out T>
,它定义了一个协变参数。因此,如果您的Export
方法收到params IEnumerable<object>[] data
参数,则您应该能够将其传递给任何IList<T>
。
答案 2 :(得分: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)
}