c# - AutoMapper 从 C# Dynamic/ExpandoObject 映射时找出继承
问题描述
我有一个问题,我正在尝试使用 AutoMapper 将来自数据库(为了清楚起见是 MongoDB,但我认为这无关紧要)的动态对象映射到特定的类。
类继承信息存储在属性 _t 中(由 Mongo 在序列化时完成) - 在创建包含继承的基础对象时,如何指示 AutoMapper 使用 _t 中的类信息?
这是我的班级信息
class Person
{
public string id { get; set; }
public Foo Foo { get; set; }
}
class Foo
{
public string name { get; set; }
public string _t { get; set; }
}
class Bar : Foo
{
public string size { get; set; }
}
我传入的动态对象如下所示:
Person.id = "Bob"
Person.Foo.name = "Bob"
Person.Foo._t = "Bar"
Person.Foo.size = "123"
当我使用 automapper 使用此代码将其映射到 Person 时
var configuration = new MapperConfiguration(cfg => {});
var mapper = configuration.CreateMapper();
Person Person = mapper.Map<Person>(MyDynamic);
结果 Person.Foo 不是 Bar 类型。我完全理解(为什么)会出现这种情况,因为 AutoMapper 不了解原始类是什么。但是考虑到类的信息存储在 _t 中,我可以指示 AutoMapper 使用它来确保 Person.Foo 是 Bar 类型吗?
解决方案
您可以通过以下方式实现它:
dynamic person = new ExpandoObject();
person.Foo = new ExpandoObject();
person.Foo.name = "Bob";
person.Foo._t = "Bar";
person.Foo.size = "123";
var configuration = new MapperConfiguration(cfg =>
{
cfg.CreateMap<dynamic, Person>().ConvertUsing((src, dst, ctx) =>
{
if (src.Foo._t == "Foo")
{
return new Person
{
Foo = ctx.Mapper.Map<Foo>(src.Foo)
};
}
else
{
return new Person
{
Foo = ctx.Mapper.Map<Bar>(src.Foo)
};
}
});
});
var mapper = configuration.CreateMapper();
Person p = mapper.Map<Person>(person);
注意:上面的示例不处理 if Foo
is的情况null
,但应该适用于您在问题中概述的确切问题。
推荐阅读
- powershell - Enable-RemoteMailbox - 从 CSV 或 TXT (PowerShell) 为一批用户设置 o365 Exchange Online Hybrid
- amazon-web-services - 如何将我的新域从 domain.com 映射到 AWS Elastic Beanstalk
- django - 如何使用 ForeignKeys ond 新 id 导入 dajngo 模型?
- php - 自然语言处理的正则表达式“不包含”模式问题
- python - pandas + python 列中最后 3 个值中的模式序列
- mysql - 我可以使用自由文本词执行 MySQL 搜索吗?
- python - 无法使用 python 代码创建子网
- multithreading - 可以有没有异步的多线程吗?
- wordpress - Wordpress 503 错误 - 如何从我的网站中删除 rocket-loader.js?
- javascript - 用于测试同一字符串中的关键字和数学表达式的 Javascript 正则表达式