EmitMapper与NLiteMapper在多接口继承下映射的问题
先恭喜下风云 的NLiteMapper组件在映射性能上有很大提高!
说正题:我在使用EmitMapper 的过程中发现,如果在一次映射中,from类型是interface(暂且叫InterfaceA吧),并且该interface(InterfaceA)又继承自另一个interface(暂且叫InterfaceB吧),这时候,InterfaceB中的属性不会映射至to类型,这样会造成映射属性数据不完的问题。出于好奇,我又测试一下风云的NLiteMapper看能解决我遇到的这个问题,答案在后面!
验证一下我刚说的话,下面是整个测试的一个简单类图
测试代码很简单
static void Main(string[] args)
{
ClassAImpISub from = new ClassAImpISub();
from.StrA = "StrA";
from.StrB = "StrB";
//emit mapper
var to = EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<ISub, ClassB>().Map(from);
Console.WriteLine("after emit mapper:");
Console.WriteLine("ClassAImpISub.StrA={0},ClassAImpISub.StrB={1}", to.StrA, to.StrB);
//nlite mapper
var to_another = NLite.Mapper.CreateMapper<ISub, ClassB>().Map(from);
Console.WriteLine("after nlite mapper:");
Console.WriteLine("ClassAImpISub.StrA={0},ClassAImpISub.StrB={1}", to_another.StrA, to_another.StrB);
Console.ReadLine();
}
这当中from类型为:ISub; to类型为:ClassB
测试结果:
很明显,StrA属性的值为空,没拿到值,当然你把from类型换为ClassAImpSub类型就没问题了,但这又是另一个问题了,我经常确实碰到这样的应用场景。
问题产生原因:
当EmitMapper在from类型中检索成员(成品类型只包括public field和property)时,没有考虑到from类型是一个接口的情况下(甚至该接口又继承自另一个接口)成员的检索规则,这时候检索出来的成员只是from接口中包括的成员,针对本例,就只是StrB属性了。至于StrA属性根据没检索到,当然不会去mapper了。
解决方法:
我的解决方法很简单,直接把EmitMapper的源代码给改了,如果from类型是接口, 可以通过Type.GetInterfaces()来拿所有它继承的接口(这是一个递归过程,不需要程序员手工去循环取父一级接口)。
希望能帮到有用到的朋友!
Author:repository
From: http://repository.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
From: http://repository.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述