先恭喜下风云 的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()来拿所有它继承的接口(这是一个递归过程,不需要程序员手工去循环取父一级接口)。
希望能帮到有用到的朋友!
来源:https://www.cnblogs.com/repository/archive/2011/04/14/2015926.html