2009-02-03 77 views
1

我正在使用以下函數將DataTable中的列(從數據層傳遞)映射到對象屬性。該函數存在於我正在填充的類中。該類有兩種方法:Load()和LoadAll(),LoadAll()返回一組已填充的對象。我希望能夠使用相同的代碼來填充當前對象或新對象。然而,我對結果不滿意,主要是因爲重複,這是一個維護的噩夢。如何重新分解這段代碼?

Private Function MapDataRowToProperties(ByVal dr As DataRow, ByVal target As Incident) As Incident 
      If target.Equals(Me) Then 
       Me.ID = Convert.ToInt32(dr.Item("pkIncidentID")) 
       Me.Description = dr.Item("IncidentDetail").ToString 
       Me.Created = Convert.ToDateTime(dr.Item("CreatedOn")) 
       ... 
       Return Me 
      Else 
       Dim NewIncident As New Incident 
       NewIncident.ID = Convert.ToInt32(dr.Item("pkIncidentID")) 
       NewIncident.Description = dr.Item("IncidentDetail").ToString 
       NewIncident.Created = Convert.ToDateTime(dr.Item("CreatedOn")) 
       ... 
       Return NewIncident 
      End If 

    End Function 

注:我很清楚的ORM工具,會爲我這樣做,我通常使用EntitySpaces,但對於這個項目,我不能這樣做。

+0

我可能是遙遠,但在這裏......在一個私人的功能,不應該針對幾乎永遠是我? – Svish 2009-02-03 13:11:15

回答

4

在我看來,你的IfElse塊僅在一個假設現有對象的事實不同(目前實例)已被傳遞,另一個通過重新創建它來覆蓋任何傳遞的引用。

這似乎像ByRef參數理想的情況下,換句話說,讓調用代碼傳遞不同的變量,並讓此功能工作,在每種情況下以同樣的方式:

Private Sub MapDataRowToProperties(ByVal dr As DataRow, ByRef target As Incident) 
    If target Is Nothing Then 
    target = New Incident() 
    End If 
    'Set properties 
    '... 
End Sub 

樣品調用:

'Usage 1: 
MapDataRowToProperties(dr, Me) 

'Usage 2: 
Dim inc as New Incident() 
MapDataRowToProperties(dr, inc) 
6

如何:

dim Inc as Incident 
if target.Equals(me) then 
    Inc = Me 
else 
    Inc = new Incident 
end if 
'Other code' 
return Inc 

OTOH如果target.Equals(我)應該只匹配當前的對象(在這種情況下,你應該用的是或的ReferenceEquals,平等相待,可以重載返回TRUE其他對象),並且您在第二種情況下傳遞新事件(或者可以修改目標),然後刪除if並直接使用target。

+0

無可否認,這是一個很好的解決方案,它讓我想起了它。唯一的一點是,它對當前的情況太具體了。 ;-) – Cerebrus 2009-02-03 13:04:44

0

希望這會有所幫助。 (請原諒我在語法上的錯誤,因爲vb編碼已經很久了)。

在調用函數

If target.Equals(Me) Then 

    target = MapDataRosToProperties(target,dr) 
Else 

    Dim target as Incident 

    target = MapDataRosToProperties(target,dr) 

重構功能

Private Function MapDataRowToProperties(ByVal target as Incident,ByVal dr as DataRow) As Incident 

    target .ID = Convert.ToInt32(dr.Item("pkIncidentID")) 
    target .Description = dr.Item("IncidentDetail").ToString 
    target .Created = Convert.ToDateTime(dr.Item("CreatedOn")) 
    ... 
    Return target 

End Function 
1

你已經一個函數試圖做太多不止一兩件事,獨立的意圖,都將變得清晰

Public Class Incident 

    Private sub CopyFrom(ByVal dr As DataRow) 
     MapDataRowToProperties(dr, me) 
    End Function 

    Private Shared Function CreateFrom(ByVal dr As DataRow) As Incident 
     Dim NewIncident As New Incident 
     MapDataRowToProperties(dr, me) 
     Return NewIncident 
    End Function 

    Private Shared sub MapDataRowToProperties(ByVal dr As DataRow, byval target As Incident) 
     target.ID = Convert.ToInt32(dr.Item("pkIncidentID")) 
     target.Description = dr.Item("IncidentDetail").ToString 
     target.Created = Convert.ToDateTime(dr.Item("CreatedOn")) 
    End Sub 
End Class 

現在使用變得

Dim aClass as new Incident 
    aClass.CopyFrom(dr) 

Dim aClass as MyClass = Incident.CreateFrom(dr)