根据输入参数

时间:2016-11-07 13:28:40

标签: c# generics

在我的很多地方的项目中,我正在处理一个csv文件。这些文件包含不同的数据 - 一些包含成分,一些员工,一些书籍等。

所以,我有这种情况:

  • csv文件1包含以下结构:bookId; bookName; bookAuthor; ...
  • csv文件2包含:ingredientId; ingredientAmount; price; name; ...
  • csv file 3包含:employeeId; employeeContractId; name; ...

我想创建一个通用方法,作为输入参数将包含文件路径,规则以及返回的内容。

规则将是一个键值对列表,它将告诉该行的哪个索引包含db的哪个属性。因此,对于csv文件1,规则列表将是这样的:

<Enum.bookId, 0> --in each row, the string with index 0 in the string after splitting by ";", has the id of the book
<Enum.bookName, 1>
<Enum.bookAuthor, 2>

有什么问题,这个方法应该以某种方式为上面提到的3个csv文件中的每一个返回不同的对象。因此对于文件1,我在db中有一个名为Book的表,因此泛型方法应该返回一个书列表。对于csv文件2,它应该返回一个成分列表等。这个方法将从不同的类调用,所以我认为它应该有一个输入参数,以某种方式告诉它应该返回什么。或者可能有输入参数T.我该怎么办?

1 个答案:

答案 0 :(得分:0)

您需要将类型T指定为泛型方法声明的一部分,并在调用时传递正确的类型。

例如声明如下:

public List<T> ParseFile<T>(string filePath)
{
    ...
}

并称之为:

var books = ParseFile<Book>("path of books.csv");

但是一旦你意识到你必须将类型作为类型参数传递,你可能也会意识到这样做会使方法变得非常通用。

您可能也应该明确:

public List<Book> ParseBookFile(string filePath)
{
    ...
}

如果您尝试从解析器返回object,那么您最终还是必须在某些时候将其转换为正确的类型,因此它并没有给您带来太大的好处。