是的,这是可能的。
如果您已经有一个JObject,那么您实际上并不需要 Automapper 将属性从它复制到您现有的目标对象。 Json.Net 序列化程序提供了一个Populate() 方法来执行此操作。您可以创建一个扩展方法,以便直接从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);
这里有一个快速演示来证明这个概念: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);