2012-07-08 112 views
2

我正在比較兩個相同類型的對象,並將差異返回到FieldChange對象的列表中。現在我列出每個字段的比較,這似乎有點不理想。有沒有辦法讓這個C#比較代碼更通用?

有沒有更清晰的方式來重構下面的代碼以避免重複?下面有兩組代碼,但實際上我有大約20個比較。

var changes = new List<FieldChange>(); 
if (proposedUpdatedProject.StatusId != existingProject.StatusId) 
{ 
    var previousStatusName = existingProject.StatusShortName; 
    existingProject.Status = ProjectModel.Repository.Fetch<ProjectStatus>(proposedUpdatedProject.StatusId); 
    changes.Add(new FieldChange { FieldName = "Status", PreviousValue = previousStatusName, NewValue = existingProject.StatusShortName }); 
} 

if (proposedUpdatedProject.TechOwnerId != existingProject.TechOwnerId) 
{ 
    var previousTechOwnerName = existingProject.TechOwnerName; 
    existingProject.TechOwner = ProjectModel.Repository.Fetch<Person>(proposedUpdatedProject.TechOwnerId); 
    changes.Add(new FieldChange { FieldName = "Tech Owner", PreviousValue = previousTechOwnerName, NewValue = existingProject.TechOwnerName }); 
} 

注意:所有對象都來自同一個名爲BaseObj的對象。另外請注意,我不只是將可比較字段的值放入FieldChange對象(id與Name屬性)

+5

你可能想給[codereview.se]一個嘗試... – Adam 2012-07-08 16:50:14

回答

2

您可以創建一個方法attribute,例如名爲ComparableAttribute。 然後,您可以用這個屬性修飾這些對象中的所有方法。

您可以在進行比較的方法中使用反射,並遍歷所有Comparable屬性。代碼會更短(一次迭代,而不是20個if語句)。

如果您需要某些屬性的自定義信息,則可以通過ComparableAttribute屬性指定它作爲參數。

比較方法仍然需要兩個參數作爲參數,但最終的實現將會小得多。你甚至可以緩存你的類型PropertyInfo,所以你不會在每個比較中都反映出來。

+0

你能澄清你將如何指示StatusId和StatusShortName之間的關係嗎? – leora 2012-07-08 19:43:11

+0

@leora:我會用'ComparableAttribute'中的參數來完成它。例如:'Comparable(Name =「Status」,ValueProperty =「StatusShortName」,LookupPropertyType = typeof(ProjectStatus))''。在比較函數中,您可以使用它來概括您現在在'if'語句中的代碼。 – 2012-07-08 19:54:24

+0

@leora:錯過了ID。應該是Comparable(Name =「Status」,IdProperty =「StatusId」,ValueProperty =「StatusShortName」,LookupPropertyType = typeof(ProjectStatus))''。如果我想一想,它應該是一個類屬性,而不是方法屬性,因爲你只需要一個對象屬性的子集。 – 2012-07-08 20:20:00

0

爲什麼不反映到結構:

existingProject 

並比較各個領域。通過以這種方式長時間編寫代碼,您可以爲狀態ID和狀態名稱之間的關聯等問題添加相當多的信息,但是如果您選擇了一些適當的命名約定,則可以將整個事件自動化。

0

爲什麼不使用INotifyPropertyChanged接口?關於它的信息請看here。你只需要實現它,並訂閱該事件。多一個link

相關問題