我有一个动态对象(实际上是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:复制一些性质
- 2. Automapper null属性
- 3. Automapper,复杂的属性和继承
- 4. AutoMapper可以映射静态属性吗?
- 5. 映射一个属性,使用AutoMapper
- 6. AutoMapper忽略属性
- 7. Automapper仿制药测绘忽略属性
- 8. 多态性与AutoMapper
- 9. 使用AutoMapper的问题将DAL属性映射到BLL属性
- 10. 复制XML属性使用LINQ
- 11. 使用龟svn复制忽略属性?
- 12. 角度ng重复和动态属性
- 13. 如何使用QDataWidgetMapper恢复对象的动态属性?
- 14. jquery复制属性
- 15. Automapper忽略属性忽略
- 16. Automapper源前缀属性
- 17. Automapper失败了吗?属性
- 18. 忽略嵌套属性 - AutoMapper
- 19. AutoMapper未映射子属性
- 20. Automapper - 地图嵌套属性
- 21. AutoMapper并且*指定属性
- 22. 使用Gradle将环境属性复制到WAR并动态更新版本属性
- 23. 使用XSL复制元素:复制的不带属性
- 24. 使用AngularJS动态更改css属性
- 25. XSL-FO动态使用属性
- 26. 使用common.logging动态设置log4net属性
- 27. 使用JSF绑定动态属性
- 28. MyBatis动态SQL使用包含属性
- 29. 存储和使用动态属性
- 30. 对象自动属性的复制
没有...我明确表示我wated复制TJE属性一个*存在的*对象! –
对不起,我不知何故错过了你的问题中的细节。我已经更新了我的答案。 –