CsvHelper 动态列映射
CsvHelper dynamic column mapping
我正在按照此示例将自定义列名称映射到我的 class 模型:
在这个特定的部分:
public FooMap()
{
Map(m => m.Id).Name("ColumnA");
Map(m => m.Name).Name("ColumnB");
}
是否可以使用字符串作为列名而不是硬编码?像这样 --
public FooMap()
{
Map("Col1").Name("ColumnA");
Map("Col2").Name("ColumnB");
}
“Col1”和“Col2”是我的 class 模型的 属性。我试过使用反射但没有用:
Map(x => typeof(MyClassModel).GetProperty("Col1")).Name("ColumnA");
请让我知道我想要实现的目标是否可行。一些附加信息——列映射(源和目标)都存储在 table.
中
谢谢!
作为另一种方法,定义一个 XML/JSON 配置文件,您可以在其中定义要映射的列。编写一个解析器,可以解析您的 XML/JSON 配置和 return 要动态映射的列。这种方法允许您动态映射任何列,而无需重新编译您的代码。
这应该允许您使用字符串映射 属性 名称和 header 名称。
void Main()
{
var mapping = new Dictionary<string, string>
{
{"Id","FooId"},
{"Name","FooName"}
};
using (var reader = new StringReader("FooId,FooName\n1,Jordan"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var fooMap = new DefaultClassMap<Foo>();
fooMap.Map(mapping);
csv.Context.RegisterClassMap(fooMap);
var records = csv.GetRecords<Foo>().ToList();
}
}
public static class CsvHelperExtensions
{
public static void Map<T>(this ClassMap<T> classMap, IDictionary<string, string> csvMappings)
{
foreach (var mapping in csvMappings)
{
var property = typeof(T).GetProperty(mapping.Key);
if (property == null)
{
throw new ArgumentException($"Class {typeof(T).Name} does not have a property named {mapping.Key}");
}
classMap.Map(typeof(T), property).Name(mapping.Value);
}
}
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
我正在按照此示例将自定义列名称映射到我的 class 模型:
在这个特定的部分:
public FooMap()
{
Map(m => m.Id).Name("ColumnA");
Map(m => m.Name).Name("ColumnB");
}
是否可以使用字符串作为列名而不是硬编码?像这样 --
public FooMap()
{
Map("Col1").Name("ColumnA");
Map("Col2").Name("ColumnB");
}
“Col1”和“Col2”是我的 class 模型的 属性。我试过使用反射但没有用:
Map(x => typeof(MyClassModel).GetProperty("Col1")).Name("ColumnA");
请让我知道我想要实现的目标是否可行。一些附加信息——列映射(源和目标)都存储在 table.
中谢谢!
作为另一种方法,定义一个 XML/JSON 配置文件,您可以在其中定义要映射的列。编写一个解析器,可以解析您的 XML/JSON 配置和 return 要动态映射的列。这种方法允许您动态映射任何列,而无需重新编译您的代码。
这应该允许您使用字符串映射 属性 名称和 header 名称。
void Main()
{
var mapping = new Dictionary<string, string>
{
{"Id","FooId"},
{"Name","FooName"}
};
using (var reader = new StringReader("FooId,FooName\n1,Jordan"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var fooMap = new DefaultClassMap<Foo>();
fooMap.Map(mapping);
csv.Context.RegisterClassMap(fooMap);
var records = csv.GetRecords<Foo>().ToList();
}
}
public static class CsvHelperExtensions
{
public static void Map<T>(this ClassMap<T> classMap, IDictionary<string, string> csvMappings)
{
foreach (var mapping in csvMappings)
{
var property = typeof(T).GetProperty(mapping.Key);
if (property == null)
{
throw new ArgumentException($"Class {typeof(T).Name} does not have a property named {mapping.Key}");
}
classMap.Map(typeof(T), property).Name(mapping.Value);
}
}
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}