所以我基本上是在解析一個消息(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
也不起作用。無論是否與out
或ref
更新功能,因爲屬性不能作爲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);
我認爲必須有一個更簡單的方法,但我需要你的幫助:)
好問題。由於它基本上歸結爲「我如何通過一個屬性作爲參數參數」(我看不出解決您的問題的另一個解決方案),我冒昧地將您的問題標記爲另一個問題的重複,這解釋了所有解決方法目前已知。如果你不同意,告訴我,我會重新打開它。 – Heinzi
我同意你的意見,這是一個非常好的答案 - 正是我所期待的。我想知道我在Google上從來沒有發現過。正如我懷疑的那樣,反思也是一種方式,而我個人最喜歡的是表達方式。 –