我有一个具有多个属性的类,它们使用xml数据转换为对象。
public class Mapper
{
[Display(Name="MapName")]
public string Name { get; set; }
[Display(Name="MapType")]
public string Type { get; set; }
}
在我们以CSV格式生成数据之前,xml数据会转换为上面的类。
现在,我们希望根据数据将某些值映射或转换为其他值。
例如:如果xml数据中的name =“xyz”,我们要将其转换为“a”, 如果来自xml数据的name =“abc”,我们希望将其转换为“123”
同样,我们有10-15个条件,我们想在生成csv之前更改数据。
有没有好方法呢?
答案 0 :(得分:1)
一种方法是使用您要执行的转换字典在setter中转换它:
public class Mapper
{
private string name;
[Display(Name = "MapName")]
public string Name
{
get { return name; }
set
{
if (value != name)
{
name = nameMap.ContainsKey(value) ? nameMap[value] : value;
}
}
}
private Dictionary<string, string> nameMap = new Dictionary<string, string>
{
{"xyz", "a"},
{"abc", "123"}
};
// Rest of class omitted
}
答案 1 :(得分:1)
除了Rufus L所说的我认为最好有一个单独的CSV格式模型并使用AutoMapper可能是从XML模型映射到CSV模型。 带映射器的setter也应该是CSV模型。原因是在CSV模型中具有CSV特定逻辑,所以明天如果要创建不同映射的excel文件,则不必担心CSV映射。
此外,如果您使用AutoMapper,您可以使用值解析器来映射某些内容,如下所示:
public class MapNameResolver : ValueResolver<string, string>{
protected override string ResolveCore(string source)
{
return nameMap.ContainsKey(source) ? nameMap[value] : value;
}
private Dictionary<string, string> nameMap = new Dictionary<string, string>
{
{"xyz", "a"},
{"abc", "123"}
};
}
并映射属性如下
.ForMember(cv => cv.Name, m => m.ResolveUsing<MapNameResolver> ().FromMember(x =>x.Name));