2016-07-15 49 views
2

我有一个动态对象(实际上是JSON.NET中的JObject),它是从JSON动态构建的。 我想将其属性复制到一个现有的对象。来自动态对象的属性应该存在于目标对象的类型中,如果没有,则可以有错误。 我正在看Automapper,最新版本,为此。我试图从JObject创建一个映射到正确的类型,但我不认为它会工作,因为JObject中的属性存储在内部字典中。 这可能吗?使用Automapper从动态复制属性

回答

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); 
+0

没有...我明确表示我wated复制TJE属性一个*存在的*对象! –

+0

对不起,我不知何故错过了你的问题中的细节。我已经更新了我的答案。 –