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

标签 c# automapper

我有以下数据容器:

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

我想使用 AutoMapper 将“字段”中的值映射到以下类的属性:

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

现在 FlatData 在“字段”中具有以下值:

"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());
}

我收到一个错误。我可以在静态映射扩展中进行调试,并且可以看到“dataRow”具有所有必需的数据,但 “ctx.DestinationValue”为空。 (ctx.DestinationType 似乎是正确的)

(_action.Select()) 返回一个 FlatData() 类型的列表

最佳答案

您可以看到 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;
}

关于c# - 尝试使用 Automapper 将字典映射到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37659215/

相关文章:

c# - 如何在 Visual Studio C# Express 中制作独立文件?

c# - 关于 StreamReader

c# - Automapper:映射由基类对象组成的集合

asp.net-core - 缺少类型映射配置或不受支持的映射。DTO 集合

c# - 使用自动映射器将一个源类映射到多个派生类

C# 可点击网格

c# - 将 Serilog 与 Microsoft.Extensions.Logging.ILogger 一起使用

c# - 使用自定义 TextWriter 时 OutputStream 不可用 mvc

c# - 帮助优化这个linq语句

C# 将两个类的数据合并到其中一个类中