代码之家  ›  专栏  ›  技术社区  ›  angularconsulting.au

net中的对象复制方法:自动映射器、发射映射器、隐式操作、属性复制

  •  12
  • angularconsulting.au  · 技术社区  · 15 年前

    如果有人知道更多在.NET中做这件事的方法,你对此有什么看法?你选择哪种方法?为什么?

    下面是对.NET中不同的对象复制方法的测试。

    How to copy value from class X to class Y with the same property name in c#?

    所以,在这里,你可以自己运行它:

    static void Main(string[] args)
        {
            Student _student = new Student();
            _student.Id = 1;
            _student.Name = "Timmmmmmmmaaaahhhh";
            _student.Courses = new List<int>();
            _student.Courses.Add(101);
            _student.Courses.Add(121);
    
            Stopwatch sw = new Stopwatch();
    
            Mapper.CreateMap<Student, StudentDTO>();            
    
            StartTest(sw, "Auto Mapper");
    
            for (int i = 0; i < 1000000; i++)
            {
                StudentDTO dto = Mapper.Map<Student, StudentDTO>(_student);
            }
    
            StopTest(sw);
    
            StartTest(sw, "Implicit Operator");
    
            for (int i = 0; i < 1000000; i++)
            {
                StudentDTO itemT = _student;
            }
    
            StopTest(sw);
    
            StartTest(sw, "Property Copy");
    
            for (int i = 0; i < 1000000; i++)
            {
    
                StudentDTO itemT = new StudentDTO
                {
                    Id = _student.Id,
                    Name = _student.Name,
                };
    
                itemT.Courses = new List<int>();
                foreach (var course in _student.Courses)
                {
                    itemT.Courses.Add(course);
                }
            }
    
            StopTest(sw);
    
            StartTest(sw, "Emit Mapper");
    
            ObjectsMapper<Student, StudentDTO> emitMapper = ObjectMapperManager.DefaultInstance.GetMapper<Student, StudentDTO>();
    
            for (int i = 0; i < 1000000; i++)
            {
                StudentDTO itemT = emitMapper.Map(_student);
            }
    
            StopTest(sw);
        }
    

    我的电脑上的测试结果:

    测试自动Mapper:22322 ms

    试验性质Copy:250 ms

    您可以从这里获得发射和自动映射器:

    http://emitmapper.codeplex.com/

    http://automapper.codeplex.com/

    3 回复  |  直到 9 年前
        1
  •  4
  •   Ivan Zivkovic    15 年前

    也可以使用T4生成将生成属性副本代码的类。

    好:尽可能快地跑 难看:制作构建脚本,让你可以一次编译所有的东西

        2
  •  1
  •   Jazza    15 年前

    for (int i = 0; i < 1000000; i++) 
    { 
         StudentDTO itemT = _student.Clone(); 
    }
    

    我发现这种方法是将对象复制到新对象中的最简单的方法,尽管我还没有做任何速度测试来找出它与您建议的方法相比的性能。

        3
  •  1
  •   Giuseppe    13 年前

    克隆用于复制同一类型,不用于从两个不同的对象复制类型,因此不能用于此范围。

    推荐文章