2016-06-14 16 views
2

私は基本的にメッセージ(HL7標準)を解析しています。文字列の値を拡張メソッドに置き換えます

これらのHL7メッセージには、すべての情報が含まれている「全体」レコードが含まれていることがあります。

ここに、データの行の例を示します。実際にこれを表す列を持つ

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

を::

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

今、これは、この行は、それは次のようになります氏名、生年月日、のようないくつかの患者/クライアントの情報が含まれているとしましょうデータの行全体。

アップデートは、次のようになります(、彼は結婚し、彼の仕事を失い、彼の髪の色を変更):

""ジョブ列の値を表し、 brownは彼の髪の色の変化を表し
||O'Connor||""|brown|| 

HL7標準では、フィールドを省略すると(たとえば名前や性別など)、変更されていないことが示されています。""は、このフィールドのデータが削除されたことを意味します。値を持つフィールドには更新が必要な場合があります。だから、最初の名前のための私の更新ロジックは

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; 

pidEntityは、最初のコードを作成していないデータベースオブジェクト、ですが、最初のデータベースとpidEntity.FirstNameが財産である)、このようになります私はこのような文字列の更新の多くを行います、だから私はちょっと考えた - refパラメータで拡張メソッドまたはメソッドを試してみてはどうですか?どちらか動作しませんthis ref string @thisに最初のパラメータを変更する

// 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); 

私の最初の試みは、これをしました。プロパティは、このようなrefまたはout引数として渡すことはできませんのでoutまたはrefで更新機能しませんどちらも:

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

基本的に「どのようにrefパラメータとしてプロパティを渡すことができますか」(私はあなたの問題に対する別の解決策は見当たりません)ので、あなたの質問を別の質問の重複としてマークし、すべての回避策を説明します現在知られている。あなたが同意しないならば、ただ教えてください。私はそれを再び開くでしょう。 – Heinzi

+0

私はあなたに同意します、それは非常に素敵な答えです - まさに私が探していたものです。どのように私はGoogleでそれを見つけたのだろうか?私が思っているように、反射を伴う方法もあり、私の個人的な好みは表現を持つものです。 –

答えて

0

文字列はimmutableです。新しい文字列を作成できますが、文字列の既存のインスタンスを更新することはできません。

関連する問題