[英]AutoMapper Custom type converter ITypeConverter and mapping nested objects
我正在尝试映射C#词典集合
IDictionary<string, object>
分解为MATLAB中使用的特定对象( MWStructArray
和MWCellArray
)。 该集合包含已解析的JSON结构。
为此,我使用AutoMapper及其ITypeConverter
实现, ITypeConverter
实现如下所示:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<IDictionary<string, object>, MWStructArray>().ConvertUsing(new MWStructArrayTypeConverter());
});
Mapper.AssertConfigurationIsValid();
public class MWStructArrayTypeConverter : ITypeConverter<IDictionary<string, object>, MWStructArray>
{
public MWStructArray Convert(ResolutionContext context)
{
var dictionary = context.SourceValue as Dictionary<string, object>;
var mwStructArray = new MWStructArray(1, 1, dictionary.Keys.ToArray());
foreach (KeyValuePair<string, object> entry in dictionary)
{
mwStructArray[entry.Key, 1] = entry.Value.ToString();
}
return mwStructArray;
}
}
我的字典包含int,string,float等单个值,但它可以包含另一个嵌套的字典或List数组。 即
IDictionary<string, IDictionary<string, object>>
要么
IDictionary<string, List<object>>
在嵌套集合的情况下,我不知道如何递归地映射它们。
任何建议将不胜感激。
您可以使用传递给convert方法的上下文对象来递归映射。
public MWStructArray Convert(ResolutionContext context)
{
var dictionary = context.SourceValue as Dictionary<string, object>;
var mwStructArray = new MWStructArray(1, 1, dictionary.Keys.ToArray());
foreach (KeyValuePair<string, object> entry in dictionary)
{
if (entry.Value is IDictionary)
{
mwStructArray[entry.Key, 1] = context.Mapper.Map<MWStructArray>(entry.Value)
}
else
{
mwStructArray[entry.Key, 1] = entry.Value.ToString();
}
}
return mwStructArray;
}
我不想编辑efredin的答案,因为它在他的系统上可能是完全正确的,但是在我的情况下,我不得不稍微修改他的代码,现在看起来像这样:
public MWStructArray Convert(ResolutionContext context)
{
var dictionary = context.SourceValue as Dictionary<string, object>;
var mwStructArray = new MWStructArray(1, 1, dictionary.Keys.ToArray());
foreach (KeyValuePair<string, object> entry in dictionary)
{
if (entry.Value is IDictionary)
{
mwStructArray[entry.Key, 1] = context.Engine.Map<MWStructArray>(entry.Value);
}
else
{
mwStructArray[entry.Key, 1] = entry.Value.ToString();
}
}
return mwStructArray;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.