AutoMapper 自定义类型转换器 ITypeConverter 和映射嵌套对象

Mar*_*usz 2 c# performance matlab json automapper

我正在尝试映射 C# 字典集合

IDictionary<string, object>
Run Code Online (Sandbox Code Playgroud)

转换为 MATLAB 中使用的特定对象(MWStructArrayMWCellArray)。该集合包含已解析的 JSON 结构。

为此,我使用 AutoMapper 及其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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的字典保存单个值,如 int、string、float 等,但它可以保存另一个嵌套字典或列表数组。IE

IDictionary<string, IDictionary<string, object>>
Run Code Online (Sandbox Code Playgroud)

或者

IDictionary<string, List<object>>
Run Code Online (Sandbox Code Playgroud)

对于嵌套集合,我不知道如何递归地映射它们。

任何建议将不胜感激。

小智 5

您可以使用传递给转换方法的上下文对象进行递归映射。

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;
    }
Run Code Online (Sandbox Code Playgroud)