繁体   English   中英

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

[英]AutoMapper Custom type converter ITypeConverter and mapping nested objects

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

IDictionary<string, object>

分解为MATLAB中使用的特定对象( MWStructArrayMWCellArray )。 该集合包含已解析的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM