2017-05-16 61 views
1

我在c#中有一個對象需要被複制多次和快速。複製對象的最快方法

目前我與

public static void CopyFieldsInto<T>(T from, T to,bool ommitNulls=false) where T : new() 
{ 
    foreach (var f in GetAllFieldsByType<T>()) 
    { 
      var v = f.GetValue(from); 
      if (ommitNulls&&v==null) 
      { 
       continue; 
      } 
      f.SetValue(to, v); 
    } 
} 

問題這樣做是GetValueSetValue耗時太久,慢下來。

有沒有更好的方法來做到這一點?

+1

你控制對象的源代碼嗎?你可以實現一個接口來幫助這個,然後你不需要使用反射。如果你必須能夠爲任意物體做到這一點,反射是你唯一的選擇。 – xxbbcc

+0

我正在考慮這樣做。但是,手動查看每個字段非常耗時,並且稍後可能會導致問題,當我添加其他字段並忘記在克隆方法中提及它們時 –

+3

看看http://stackoverflow.com/questions/5476575/具有更好性能的克隆 – HimBromBeere

回答

1

如果您需要使用反射來複制對象的屬性,則無法避免使用GetValueSetValueHere是另一種類似於您的方法。也可能值得考慮使用AutoMapper或類似的工具。

+1

「無法避免使用GetValue和SetValue」?沒有人強迫你這樣做 - 你可以發出代碼(源,IL或表達式樹)來做到這一點很好 - http://stackoverflow.com/questions/321650/how-do-i-set-a-field-值在-AN-C鋒利表達樹 –