我有一个动态对象(实际上是JSON.NET中的JObject),它是从JSON动态构建的。 我想将其属性复制到一个现有的对象。来自动态对象的属性应该存在于目标对象的类型中,如果没有,则可以有错误。 我正在看Automapper,最新版本,为此。我试图从JObject创建一个映射到正确的类型,但我不认为它会工作,因为JObject中的属性存储在内部字典中。 这可能吗?使用Automapper从动态复制属性
2
A
回答
4
是的,这是可能的。
如果您已经有JObject
,那么您并不需要Automapper将它的属性复制到您的现有目标对象。 Json.Net序列化程序提供了一个PopulateObject()
方法,它将执行此操作。您可以创建一个扩展方法可以很容易地从一JObject拨打:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public static class JsonExtensions
{
public static void PopulateObject<T>(this JToken jt, T target)
{
JsonSerializer serializer = new JsonSerializer();
serializer.Populate(jt.CreateReader(), target);
}
}
然后,每当你需要复制就可以做到这一点的属性:
jObj.PopulateObject<Foo>(existingFoo);
注意:如果您的变量持有该JObject声明为dynamic
那么你就必须投它,因此运行时绑定可以找到扩展方法:
((JObject)jObj).PopulateObject<Foo>(existingFoo);
这里是一个快速演示,以证明与c oncept:https://dotnetfiddle.net/dhPDCj
如果您仍然倾向于使用Automapper,则可以将其配置为执行相同的转换,而不是其通常的基于成员的映射。关键是建立映射时使用的ConvertUsing
方法:
Mapper.Initialize(cfg => cfg.CreateMap<JObject, Foo>().ConvertUsing((jo, foo) =>
{
JsonSerializer serializer = new JsonSerializer();
serializer.Populate(jo.CreateReader(), foo);
return foo;
}));
然后使用此代码复制属性:
Mapper.Map<JObject, Foo>(jObj, existingFoo);
相关问题
- 1. AutoMapper复杂的ViewModel属性
- 2. 从object1复制值使用AutoMapper
- 3. Automapper:复制一些性质
- 4. 使用xslt从父级复制属性
- 5. 使用Automapper动态映射
- 6. Automapper null属性
- 7. Automapper,复杂的属性和继承
- 8. AutoMapper可以映射静态属性吗?
- 9. 从源“表”复制属性
- 10. 使用Automapper仅映射特定属性
- 11. 映射一个属性,使用AutoMapper
- 12. 在共享属性上使用AutoMapper?
- 13. Automapper映射属性
- 14. AutoMapper忽略属性
- 15. Automapper仿制药测绘忽略属性
- 16. 活动目录复制用户属性
- 17. 多态性与AutoMapper
- 18. Solr复制主从属 - ReplicateAfter属性
- 19. 使用AutoMapper的问题将DAL属性映射到BLL属性
- 20. “保留块属性不会复制块 - 使用复制属性代替
- 21. 如何使用Minidom复制XML属性?
- 22. 复制XML属性使用LINQ
- 23. 使用龟svn复制忽略属性?
- 24. 使用automapper从两个类与第三类的自动映射属性
- 25. 角度ng重复和动态属性
- 26. 动态对象属性重复声明
- 27. 如何使用QDataWidgetMapper恢复对象的动态属性?
- 28. 如何使用动态属性创建复合组件?
- 29. 使用AutoMapper将数据从SuperClass复制到子类
- 30. Automapper和EF导航属性
没有...我明确表示我wated复制TJE属性一个*存在的*对象! –
对不起,我不知何故错过了你的问题中的细节。我已经更新了我的答案。 –