2009-01-22 26 views
5

我用一個靜態方法編寫了一個類,它將屬性值從一個對象複製到另一個對象。它不關心每個對象是什麼類型,只是它們具有相同的屬性。它做我需要的,所以我沒有進一步設計它,但你會做出什麼改進?你會如何改進這個淺層複製課程?

下面的代碼:

public class ShallowCopy 
{ 
    public static void Copy<From, To>(From from, To to) 
     where To : class 
     where From : class 
    { 
     Type toType = to.GetType(); 
     foreach (var propertyInfo in from.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance)) 
     { 
      toType.GetProperty(propertyInfo.Name).SetValue(to, propertyInfo.GetValue(from, null), null); 
     } 
    } 
} 

我使用它,如下所示:

EmployeeDTO dto = GetEmployeeDTO(); 
Employee employee = new Employee(); 
ShallowCopy.Copy(dto, employee); 
+0

我們如何使用這個用List 或者一個目標,有幾個列表其中列出了? – 2014-10-01 17:19:14

回答

6

是你的DTO的序列化?我期望如此,在這種情況下:

MemberInfo[] sm = FormatterServices.GetSerializableMembers(typeof(From)); 
object[] data = FormatterServices.GetObjectData(from, sm); 
FormatterServices.PopulateObjectMembers(to, sm, data); 

但請注意,我並不完全同意這種一般方法。我更願意在每個DTO實施的DTO上覆制一份強有力的合同。

2

創建的To一個新的實例,並調用Copy()方法之前返回可能是有用的新方法。

像這樣:

public static To Create<From, To>(From from) 
    where To : class, new() 
    where From : class 
{ 
    var to = new To(); 
    Copy(from, to); 
    return to; 
} 
1

如果傳遞共享某些屬性但不是全部的類型的對象,則決定要執行的操作。在嘗試設置對象的值之前,檢查To對象中From對象中是否存在屬性。當你來到一個不存在的財產時,做正確的事情。如果所有公共屬性都必須相同,則需要檢查是否已將所有屬性都設置爲To對象,並處理沒有適當的情況。

我也建議你可能想使用屬性來裝飾需要複製和忽略其他屬性。這將允許您更輕鬆地在兩個不同對象之間來回切換,並繼續維護一些派生而不是存儲在業務對象上的公共屬性。

4
  • 更改您的類型參數名稱以符合命名約定,例如, TFrom和TTo,或TSource和TDest(或TDestination)。

  • 在泛型類型中執行大部分工作,而不是僅使用泛型方法。這允許你緩存屬性,並允許類型推斷。類型推斷對於「TFrom」參數很重要,因爲它允許使用匿名類型。

  • 通過動態生成代碼來執行屬性複製並將其保存在對「from」類型有效的委託中,您可能會使其盲目快速。或者可能爲每個from/to pair產生它,這意味着實際的複製將不需要使用反射! (準備代碼將是一次性的每對種打擊,但希望你不會有太多的對。)