gpt4 book ai didi

具有不同泛型参数的 C# 泛型返回类型

转载 作者:行者123 更新时间:2023-11-30 13:54:34 33 4
gpt4 key购买 nike

我正在处理不同 CSV 文件的管道,因此想编写一个通用的读取器和写入器,只需传递必要的类型即可。 RegisterClassMap() 通常采用您定义的 Mapper。第一个示例是不使用泛型的工作代码。

    public static IEnumerable<CacheEntryRequest> ReadCacheRequestFile(string filename)
{
List<CacheEntryRequest> requests;
using (var sr = new StreamReader(filename))
{
var csv = new CsvReader(sr);
csv.Configuration.RegisterClassMap<CacheEntryRequestMapper>();
requests = csv.GetRecords<CacheEntryRequest>().ToList();
}

return requests;
}

接下来是我尝试为 Mapper 类型编写带有泛型参数的泛型方法的失败尝试:

    public static IEnumerable<TR> Read<TR, TMap>(string filename)
{
List<TR> records;
using (var sr = new StreamReader(filename))
{
var csv = new CsvReader(sr);
csv.Configuration.RegisterClassMap<TMap>();
records = csv.GetRecords<TR>().ToList();
}
return records;
}

之后 RegisterClassMap 提示:

The type 'TMap' cannot be used as a type parameter 'TMap' in the generic type or method 'CsvConfiguration.RegisterClassMap()'. There is no boxing or unboxing conversion or type parameter conversion from 'TMap' to 'CsvHelper.Configuration.CsvClassMap'.

期望的用法是:

        var records = CsvFile.Read<CacheEntryRequest, CacheEntryRequestMapper>(filename);

最佳答案

为了能够使用TMap , TMap需要与 RegisterClassMap<T> 的输入类型兼容方法。

您可以使用通用约束来做到这一点。参见 https://msdn.microsoft.com/en-us/library/d5x73970.aspx .

在您的情况下,您需要将方法签名更改为 public static IEnumerable<TR> Read<TR, TMap>(string filename) where TMap : CsvClassMap或类似的东西。

可能是类 CacheEntryRequest有一个基类。那将是您的通用约束。

现在。假设你有一个像

这样的映射类
public class CustomCacheEntryRequestMapper :  CsvClassMap
{
...
}

然后您可以像这样调用您的方法:

var records = CsvFile.Read<CacheEntryRequest, CustomCacheEntryRequestMapper >(filename); 

关于具有不同泛型参数的 C# 泛型返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41728901/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com