2016-06-14 43 views
2

所以我基本上是在解析一個消息(HL7標準)。用擴展方法替換字符串值

有時這些HL7信息包含一個「全部」記錄,包含所有信息,有時候只是其中的更新部分。

下面是一行數據的示例。比方說,此行中包含類似名稱的一些患者/客戶信息,出生日期等,這看起來是這樣的:

|Mike|Miller|19790530|truck driver|blonde|m| 

與代表其實這列:

|first name|surname|date of birth|job|hair color|gender| 

現在,這是一個整行數據。

的更新可能是這樣的(他結婚了,失去了工作,改變了他的頭髮顏色):

||O'Connor||""|brown|| 

其中""表示作業列的值和brown代表他的頭髮顏色的變化。

在HL7標準中指出,省略字段(例如名字或性別)意味着沒有更改,其中""表示該字段中的數據已被刪除。具有值的字段可能需要更新。所以,我的名字更新邏輯將類似於此(pidEntity是一個數據庫對象,而不是創建的代碼第一,但數據庫第一和pidEntity.FirstName是一個屬性)

var pid = this.message.PID; // patient identification object from parsed message 
if (pid.PatientName.GivenName.Value == string.Empty) 
{ 
    // "" => deletion flag 
    pidEntity.FirstName = null; 
} 
else if (pid.PatientName.GivenName.Value == null) 
{ 
    // omitted, no changes 
    return; 
} 
pidEntity.FirstName = pid.PatientName.GivenName.Value; 

我做了很多的字符串更新這樣的,所以我想嘿 - 爲什麼不嘗試用ref參數的擴展方法或方法。

我的第一次嘗試是這樣的:

// doesn't work because strings are immutable 
public static void Update(this string @this, string newValue) 
{ 
    if (newValue == string.Empty) @this = null; 
    else if (newValue == null) return; 
    @this = newValue; 
} 

// usage 
pidEntity.FirstName.Update(pid.PatientName.GivenName.Value); 

的第一個參數更改爲this ref string @this也不起作用。無論是否與outref更新功能,因爲屬性不能作爲ref或out參數這樣傳遞:

public static void Update(ref string property, string newValue) 
// usage 
Update(pidEntity.FirstName, pid.PatientName.GivenName.Value); 

最「優雅」我能想出到目前爲止,要麼是這個,無視事實上,""表示將數據庫對象的值設置爲null,並將其設置爲空字符串。

pidEntity.FirstName = pid.PatientName.GivenName.Value ?? pidEntity.FirstName; 

我的其他溶液的擴展方法如下工作:

public static void UpdateString(this string hl7Value, Action<string> updateAct) 
{ 
    if (updateAct == null) throw new ArgumentNullException(nameof(updateAct)); 

    if (hl7Value == string.Empty) updateAct(null); 
    else if (hl7Value == null) return; 
    updateAct(hl7Value); 
} 
// usage 
pid.PatientName.GivenName.Value.UpdateString(v => pidEntity.FirstName = v); 

我認爲必須有一個更簡單的方法,但我需要你的幫助:)

+0

好問題。由於它基本上歸結爲「我如何通過一個屬性作爲參數參數」(我看不出解決您的問題的另一個解決方案),我冒昧地將您的問題標記爲另一個問題的重複,這解釋了所有解決方法目前已知。如果你不同意,告訴我,我會重新打開它。 – Heinzi

+0

我同意你的意見,這是一個非常好的答案 - 正是我所期待的。我想知道我在Google上從來沒有發現過。正如我懷疑的那樣,反思也是一種方式,而我個人最喜歡的是表達方式。 –

回答

0

(也許反射?)字符串是immutable - 您可以創建一個新字符串,但不能更新字符串的現有實例。