• 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()来拿所有它继承的接口(这是一个递归过程,不需要程序员手工去循环取父一级接口)。

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

  • 相关阅读:
    CodeForces1152CNeko does Maths
    π的计算公式
    IFS变量对加双引号和不加双引号变量的区别对待
    各种距离
    ADO.NET Data Service 二 绑定数据类
    向客户端注入JavaScript代码
    Ajax ModelPopu and Progress 示例学习
    Sliverlight 入门教程七
    (牛人莫入)Jquery plugin 多文件上传
    自定义控件的验证使用
  • 原文地址:https://www.cnblogs.com/repository/p/2015926.html
Copyright © 2020-2023  润新知