如何解决如何在运行时为嵌套属性构建类映射
假设我有这样的数据结构:
public class Foo
{
public Bar A {get;set;}
public Bar B {get;set;}
public int C {get;set;}
}
public class Bar
{
public int Value {get;set;}
}
Column1,Column2,Column3
0,1,2
3,4,5
我现在想将 Column1
映射到 A.Value
,将 Column2
映射到 B.Value
,将 Column3
映射到 C
。
我仅限于运行时映射。
对于Column3
-> C
,我可以写
var type = typeof(Foo);
var customMap = Activator.CreateInstance(typeof(DefaultClassMap<>).MakeGenericType(type)) as ClassMap;
customMap.Map(type,type.GetProperty("C")).Name("Column3");
csv_reader.Context.RegisterClassMap(customMap);
如何映射第 1 列和第 2 列?
解决方法
目前您可以这样做。
void Main()
{
var s = new StringBuilder();
s.Append("Column1,Column2,Column3\r\n");
s.Append("0,1,2\r\n");
s.Append("3,4,5\r\n");
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
};
using (var reader = new StringReader(s.ToString()))
using (var csv = new CsvReader(reader,config))
{
var fooType = typeof(Foo);
var barType = typeof(Bar);
var fooMapType = typeof(DefaultClassMap<>).MakeGenericType(fooType);
var barMapType = typeof(DefaultClassMap<>).MakeGenericType(barType);
var map = (ClassMap)ObjectResolver.Current.Resolve(fooMapType);
map.Map(fooType,fooType.GetProperty("C")).Name("Column3");
map.References(barMapType,fooType.GetProperty("A")).Data.Mapping.Map(barType,barType.GetProperty("Value")).Name("Column1");
map.References(barMapType,fooType.GetProperty("B")).Data.Mapping.Map(barType,barType.GetProperty("Value")).Name("Column2");
csv.Context.RegisterClassMap(map);
csv.GetRecords<Foo>().ToList().Dump();
}
}
private class Foo
{
public Bar A { get; set; }
public Bar B { get; set; }
public int C { get; set; }
}
public class Bar
{
public int Value { get; set; }
}
我正在寻找方法让想要在运行时创建地图的人更容易做到这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。