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

C# 尝试使用Automapper将字典映射到对象,c#,automapper,C#,Automapper,我有以下数据容器: public class FlatData { public Dictionary<string, object> Fields {get;set;} } 现在,FlatData在“字段”中具有以下值: 我编写了以下扩展来映射此: public static class MappingExtensions { public static T ConvertUsingFlatData<T>(ResolutionContex

我有以下数据容器:

public class FlatData {
  public Dictionary<string, object> Fields {get;set;}
}
现在,FlatData在“字段”中具有以下值:

我编写了以下扩展来映射此:

 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;
        }
    }
公共静态类映射扩展
{
使用FlatData的公共静态T转换(ResolutionContext ctx,FlatData)
{
var dest=ctx.DestinationValue;
foreach(data.Fields中的var字段)
{
var target=ctx.DestinationType.GetProperty(field.Key);
target.SetValue(dest,field.Value);
}
返回(T)目的地;
}
}
现在当我尝试读取和映射数据时

  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());
}
公共Myrepo(MyActions)
{
_行动=行动;
_mapper=新的MapperConfiguration(cfg=>
{
cfg.CreateMap()
.ConvertUsing((ctx,s)=>MappingExtensions.ConvertUsingFlatData(ctx,s));
}).CreateMapper();
}
公共IEnumerable GetAll(){
返回_mapper.Map(_actions.Select());
}
我收到一个错误。我可以在静态映射扩展内部进行调试,并且可以看到“dataRow”包含所有必需的数据,但是“ctx.DestinationValue”为null。(ctx.DestinationType似乎是正确的)


(_action.Select())返回FlatData()的列表(Type)

您可以看到
DestinationValue
属性作为映射过程中传递的值(当您使用
map(source,destination)
重载时),但在您的情况下,您不会传递任何值。这是一个已知的问题,您可以阅读更多

但在您的情况下,您无法传递目标值,因为您正在映射集合,但您可以尝试以下操作:

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;
}
使用FlatData的公共静态T转换(ResolutionContext ctx,FlatData)
{
var dest=Activator.CreateInstance();
foreach(data.Fields中的var字段)
{
var target=ctx.DestinationType.GetProperty(field.Key);
target.SetValue(dest,field.Value);
}
返回目的地;
}

Automapper将尝试将属性名称映射到目标类中的匹配属性。我认为您必须访问父级,并专门编写属性。
  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());
}
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;
}