尝试使用Automapper将字典映射到对象

时间:2016-06-06 13:49:12

标签: c# automapper

我有以下DataContainer:

public class FlatData {
  public Dictionary<string, object> Fields {get;set;}
}

我想使用AutoMapper在&#34;字段&#34;中映射值。到以下类的属性:

public class Target {
   public string Name {get;set;}
   public string Description { get;set; }
   public int Id { get;set; }
}

现在FlatData在&#34; Fields&#34;:

中有以下值
"Id" -> 12
"Name" -> "Jean Luc"
"Description" -> "Captain"

我写了下面的扩展来映射这个:

 public static class MappingExtensions
    {
        public static T ConvertUsingFlatData<T>(ResolutionContext ctx, FlatData data)
        {
            var dest = ctx.DestinationValue;

            foreach (var field in data.Fields)
            {
                var target = ctx.DestinationType.GetProperty(field.Key);

                target.SetValue(dest, field.Value);
            }

            return (T)dest;
        }
    }

现在,当我尝试阅读和映射数据时

  public Myrepo(MyActions actions)
        {
            _actions = actions;
            _mapper = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<FlatData, Target>()
                    .ConvertUsing((ctx, s) => MappingExtensions.ConvertUsingFlatData<Target>(ctx, s));
            }).CreateMapper();
        }
public IEnumerable<Target> GetAll() {
  return _mapper.Map<IEnumerable<Target>>(_actions.Select());
}

我收到错误。我可以在静态Mapping扩展中调试,并且可以看到&#34; dataRow&#34;拥有所有必需的数据,但&#34; ctx.DestinationValue&#34;为空。 (ctx.DestinationType似乎是正确的)

(_ action.Select())返回FlatData() - Type)的列表

1 个答案:

答案 0 :(得分:1)

您可以将DestinationValue属性视为地图中传递的值(当您使用Map(source, destination)重载时),但在您的情况下,您并未传递任何属性。这是一个已知问题,您可以阅读更多here

但是在您的情况下,由于您要映射集合,因此无法传递目标值,但您可以尝试这样的事情:

public static T ConvertUsingFlatData<T>(ResolutionContext ctx, FlatData data) 
{
    var dest = Activator.CreateInstance<T>();

    foreach (var field in data.Fields)
    {
        var target = ctx.DestinationType.GetProperty(field.Key);

        target.SetValue(dest, field.Value);

    }

    return dest;
}