您可以使用automapper对所有非映射属性执行特定操作吗?

时间:2015-11-09 20:35:57

标签: c# automapper

我正在实施一个导入功能,该功能将读取电子表格文件并将所有行保存为DB上的记录。 我已经有代码将电子表格转换为DataSet

我现在遇到的问题是我需要将DataRows反序列化的类是这样的:

public class Product
{
    public string Name { get; set; }

    // More Props

    public IDictionary<string, object> Specifications { get; set; }
}

每个DataRow都会包含所有Product个属性,还有一些额外的属性需要添加到Specifications Dictionary中。

有没有办法配置AutoMapper将目标中所有不存在的属性映射到Specifications Dictionary上的新项?

1 个答案:

答案 0 :(得分:3)

您无法执行特定操作,但可以创建自定义映射,查找所有未映射的属性并将其添加到目标字典。

这有点棘手,因为你是从DataRow而不是普通的类映射,但它可以完成。在Specifications的解析方法中,您需要循环遍历DataTable的列,并检查是否存在具有该名称的属性的映射。如果没有将其添加到字典中:

    private static void ConfigureMappings()
    {
        Mapper.CreateMap<DataRow, Product>()
            .ForMember(p => p.Name, mo => mo.MapFrom(row => row["Name"]))
            .ForMember(p => p.ID, mo => mo.MapFrom(row => row["ID"]))
            .ForMember(p => p.Specifications, mo => mo.ResolveUsing(MapSpecifications));
    }

    private static object MapSpecifications(ResolutionResult rr, DataRow row)
    {
        Dictionary<string, object> specs = new Dictionary<string, object>();

        // get all properties mapped in this mapping
        var maps = rr.Context.Parent.TypeMap.GetPropertyMaps();

        // loop all columns in the table
        foreach (DataColumn col in row.Table.Columns)
        {
            // if no property mapping exists, get value and add to dictionary
            if (!maps.Any(map => map.DestinationProperty.Name == col.ColumnName))
            {
                specs.Add(col.ColumnName, row[col.ColumnName]);
            }
        }

        return specs;
    }

Sample dotnetFiddle