【问题标题】:Csvhelper set index dynamically to different csvCsvhelper 将索引动态设置为不同的 csv
【发布时间】: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 都会填充该类。

【问题讨论】:

    标签: c# csvhelper


    【解决方案1】:
    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);
            }
        }
    }
    

    【讨论】:

    • 您好,感谢您的回复。我想避免直接在这些类上使用 CSVHelper 属性,我想在运行时从创建的自定义属性中注入它。我试图避免将 Person 类硬耦合到 CSVHelper。
    猜你喜欢
    • 1970-01-01
    • 2015-03-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2020-10-18
    • 2018-10-09
    相关资源
    最近更新 更多