加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – AutoMapper将未映射的属性映射到Dictionary / ExtensionDa

发布时间:2020-12-15 23:38:36 所属栏目:百科 来源:网络整理
导读:如何让AutoMapper将缺少的未映射属性映射到目标对象内的字典? (在序列化期间像 ExtensionData) 例: class Source{ public int A {get;set;} public int B {get;set;} public int C {get;set;} }class Destination{ public int A {get;set;} public Diction
如何让AutoMapper将缺少的未映射属性映射到目标对象内的字典? (在序列化期间像 ExtensionData)

例:

class Source
{
    public int A {get;set;} 
    public int B {get;set;} 
    public int C {get;set;} 
}

class Destination
{
    public int A {get;set;}
    public Dictionary<string,object> D {get;set;}
}

Source s = new Source { A = 1,B = 2,C = 3 };
Destination d = ... // Mapping code

现在我想要以下结果:

d.A ==> 1
d.D ==> {{ "B",2 },{ "C",3 }}

*编辑*

最后,我正在寻找一种没有反思的解决方案.含义:在设置/配置/初始化期间允许反射,但在映射本身期间,我不希望由反射引起任何延迟.

*编辑*

我正在寻找一个通用的解决方案,就像序列化器一样.

解决方法

您的问题有很多可能的解决方案.
我为您的属性创建了一个自定义值解析器,它完美地运行:

public class CustomResolver : IValueResolver<Source,Destination,Dictionary<string,object>>
{
    public Dictionary<string,object> Resolve(Source source,Destination destination,object> destMember,ResolutionContext context)
    {
        destMember = new Dictionary<string,object>();

        var flags = BindingFlags.Public | BindingFlags.Instance;
        var sourceProperties = typeof(Source).GetProperties(flags);

        foreach (var property in sourceProperties)
        {
            if (typeof(Destination).GetProperty(property.Name,flags) == null)
            {
                destMember.Add(property.Name,property.GetValue(source));
            }
        }

        return destMember;
    }
}

如何使用它?

static void Main(string[] args)
{
    Mapper.Initialize(cfg => {
        cfg.CreateMap<Source,Destination>()
            .ForMember(dest => dest.D,opt => opt.ResolveUsing<CustomResolver>());
    });

    var source = new Source { A = 1,C = 3 };

    var result = Mapper.Map<Source,Destination>(source);
}

public class Source
{
    public int A { get; set; }
    public int B { get; set; }
    public int C { get; set; }
}

public class Destination
{
    public int A { get; set; }
    public Dictionary<string,object> D { get; set; }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读