2010-08-11 111 views
13

如果有人知道在.NET中使用这种方法的更多方法,以及您对这种方法有何看法?你选择哪种方法,为什么?.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); 
    } 

我的电脑上测试的结果22322 ms

Test Implicit Operator:310 ms

测试特性复制:250毫秒

测试的Emit映射:281毫秒

你可以从这里发射和经销商-mappers:

http://emitmapper.codeplex.com/

http://automapper.codeplex.com/

+5

这很好,但你的问题是什么? – Oded 2010-08-11 11:15:37

+0

是的,我没有看到这一点。在你决定需要一个副本(而不是使用原始对象)之前,你需要一个目标,并且你需要一个目标来选择正确的方法。也就是说,另一台复印机是MemberwiseClone()。 – Qwertie 2010-11-10 16:30:58

+0

您是否尝试创建一个测试对象的副本..我不明白问题......您可以在.net4中使用痣...... Mapper会最好的工作..但请澄清您的问题 – 2010-11-12 17:55:03

回答

4

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

好:跑一样快,因为它是可能的 坏:“编码”,在T4 丑:使构建脚本,让你编译于一身去

+1

对于垃圾邮件标志,请住手。此外,这个答案不是一半坏。 – Will 2010-11-16 21:46:32

+0

你知道有哪些资源可以开始使用T4来创建这种类型的副本助手吗? – 2012-03-20 20:31:11

1

您是否尝试过重写Clone方法复制对象实例?这样一来,你会得到一个新的学生对象是这样的:

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

我发现这种方法复制的最简单的方法对象到新的对象,虽然我没有做过任何速度测试,以了解它如何执行对你建议的方法。

1

克隆是用于复制相同的类型不适用于从2个不同的对象复制类型,然后不能用于此范围。