根据源值数据映射到不同的值

时间:2018-05-15 16:13:54

标签: c# .net

我有一个具有多个属性的类,它们使用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之前更改数据。

有没有好方法呢?

2 个答案:

答案 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));