2010-08-11 125 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個不同的對象複製類型,然後不能用於此範圍。