【发布时间】:2020-02-03 09:42:05
【问题描述】:
我从不同的客户那里收到不带标题的不同 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 都会填充该类。
【问题讨论】: