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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |