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

时间:2017-01-13 14:43:56

标签: c# json matlab performance automapper

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

IDictionary<string, object>

到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;
    }
}

我的字典包含单个值,如int,string,float等,但它可以容纳另一个嵌套字典或List数组。即。

IDictionary<string, IDictionary<string, object>>

IDictionary<string, List<object>>

如果是嵌套集合,我不知道如何以递归方式映射它们。

非常感谢任何建议。

2 个答案:

答案 0 :(得分:3)

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

tableViewHeightConstraint.constant = desiredHeight

layoutIfNeeded()

答案 1 :(得分:0)

我不想编辑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;
    }