Csvhelper 将索引动态设置为不同的 csv



我从不同的客户那里收到不同的没有标头的CSV(我们同意内容但不同意格式(,我正在尝试构建一个通用类,可以解析它与CSVHelper硬耦合(谁知道明天是否不再支持它(。 例如,第一个客户发送 CSV 作为 "名字!姓氏;年龄;出生地",第二个客户将其发送为"出生地;姓氏;名字;年龄",另一位客户发送"名字;姓氏"。我创建了一个自定义属性,在其中放置了预期的索引,并且在运行时我想从 CsvHelper 添加 IndexAttribute。

partial class CustomAttribute : Attribute
{
public int Index { get; set; }
}
public class PersonCustomer1 : IPerson
{
[CustomAttribute(Index = 0)]
public string Name { get; set; }
[CustomAttribute(Index = 1)]
public string Lastname { get; set; }
[CustomAttribute(Index = 3)]
public int Age { get; set; }
}
public class PersonCustomer2 : IPerson
{
[CustomAttribute(Index = 2)]
public string Name { get; set; }
[CustomAttribute(Index = 1)]
public string Lastname { get; set; }
[CustomAttribute(Index = 0)]
public int Age { get; set; }
[CustomAttribute(Index = 3)]
public int Gender { get; set; }
}

通用转换器构建为

public class ConverterCsv<T>
{
public IEnumerable<T> Convert(FileInfo fileInfo)
{
IEnumerable<T> records = new List<T>();
using (var reader = fileInfo.OpenText())
using (var csv = new CsvReader(reader))
{
csv.Configuration.HasHeaderRecord = false;
csv.Configuration.RegisterClassMap<CsvGenericMap<T>>();
records = csv.GetRecords<T>().ToList();
}
return records;
}
}
public sealed class CsvGenericMap<T> : ClassMap<T>
{
public CsvGenericMap()
{
foreach (var property in typeof(T).GetProperties())
{
var attribute = property?.GetCustomAttribute<CustomAttribute>();
//what now? How should I inject the CsvHelper.Configuration.Attributes.Index attribute?
}
}
}

我希望任何带有自定义属性集的 csv 都会填充类。

public sealed class CsvGenericMap<T> : ClassMap<T>
{
public CsvGenericMap()
{
foreach (var property in typeof(T).GetProperties())
{
var attribute = property?.GetCustomAttribute<CustomAttribute>();
Map(typeof(T), property).Index(attribute.Index);
}
}
}

最新更新