EmitMapper与NLiteMapper在多接口继承下映射的问题

先恭喜下风云 的NLiteMapper组件在映射性能上有很大提高!

说正题:我在使用EmitMapper 的过程中发现,如果在一次映射中,from类型是interface(暂且叫InterfaceA吧),并且该interface(InterfaceA)又继承自另一个interface(暂且叫InterfaceB吧),这时候,InterfaceB中的属性不会映射至to类型,这样会造成映射属性数据不完的问题。出于好奇,我又测试一下风云的NLiteMapper看能解决我遇到的这个问题,答案在后面!

验证一下我刚说的话,下面是整个测试的一个简单类图

cd

测试代码很简单

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

测试结果:

result

很明显,StrA属性的值为空,没拿到值,当然你把from类型换为ClassAImpSub类型就没问题了,但这又是另一个问题了,我经常确实碰到这样的应用场景。

问题产生原因:

当EmitMapper在from类型中检索成员(成品类型只包括public field和property)时,没有考虑到from类型是一个接口的情况下(甚至该接口又继承自另一个接口)成员的检索规则,这时候检索出来的成员只是from接口中包括的成员,针对本例,就只是StrB属性了。至于StrA属性根据没检索到,当然不会去mapper了。

解决方法:

我的解决方法很简单,直接把EmitMapper的源代码给改了,如果from类型是接口, 可以通过Type.GetInterfaces()来拿所有它继承的接口(这是一个递归过程,不需要程序员手工去循环取父一级接口)。

希望能帮到有用到的朋友!

原文地址:https://www.cnblogs.com/repository/p/2015926.html