尝试使用 Automapper 将字典映射到对象
Trying to use Automapper to Map Dictionary to Object
我有以下数据容器:
public class FlatData {
public Dictionary<string, object> Fields {get;set;}
}
我想使用 AutoMapper 将 "Fields" 中的值映射到以下 class 的属性:
public class Target {
public string Name {get;set;}
public string Description { get;set; }
public int Id { get;set; }
}
现在 FlatData 在 "Fields" 中具有以下值:
"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" 为 null。 (ctx.DestinationType好像是对的)
(_action.Select()) returns 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;
}
我有以下数据容器:
public class FlatData {
public Dictionary<string, object> Fields {get;set;}
}
我想使用 AutoMapper 将 "Fields" 中的值映射到以下 class 的属性:
public class Target {
public string Name {get;set;}
public string Description { get;set; }
public int Id { get;set; }
}
现在 FlatData 在 "Fields" 中具有以下值:
"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" 为 null。 (ctx.DestinationType好像是对的)
(_action.Select()) returns 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;
}