2016-06-14 15 views
2

Also was ich im Grunde mache, ist das Parsen einer Nachricht (HL7-Standard).Ersetze Zeichenfolgenwert mit Erweiterungsmethode

Manchmal enthalten diese HL7-Nachrichten einen "ganzen" Datensatz mit allen Informationen, manchmal sind nur die aktualisierten Teile darin enthalten.

Hier ist ein Beispiel für eine Reihe von Daten. Nehmen wir an diese Zeile einige Patienten/Klienten Informationen wie Name enthält, Geburtsdatum, etc. Es könnte wie folgt aussehen:

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

mit den Spalten tatsächlich diese darstellt:

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

Nun ist diese a ganze Reihe von Daten.

Ein Update könnte wie folgt aussehen (er heiratete, verlor seinen Job und änderte seine Haarfarbe):

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

wo "" den Wert der Job Spalte repräsentiert und brown stellt die Änderung seiner Haarfarbe.

Im HL7-Standard heißt es, dass das Weglassen von Feldern (wie zum Beispiel Vorname oder Geschlecht) bedeutet, dass keine Änderung vorgenommen wurde, wobei die "" bedeutet, dass die Daten in diesem Feld gelöscht wurden. Felder mit Werten benötigen möglicherweise eine Aktualisierung. Also meine Update-Logik für Vornamen würde so aussehen (pidEntity ist ein Datenbankobjekt, nicht zum ersten Mal erstellt Code, sondern Datenbank zuerst und pidEntity.FirstName ist eine Eigenschaft)

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; 

ich viel Zeichenfolge Updates wie dies zu tun, also dachte ich hey - warum nicht mit einer Erweiterungsmethode oder Methode mit ref Parameter versuchen.

Mein erster Versuch war:

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

den ersten Parameter ändern zu this ref string @this funktioniert auch nicht. Genauso wenig wie eine Update-Funktion mit out oder ref weil Eigenschaften nicht als ref oder out-Argument wie folgt übergeben werden:

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

Die „elegant“ ich mit so weit kommen konnte, war entweder das, ohne auf dem Tatsache, dass "" bedeutet, setzen Sie den Wert des Datenbankobjekts auf null und setzen Sie es stattdessen auf eine leere Zeichenfolge.

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

Meine andere Lösung wurde eine Erweiterung Methode wie folgt arbeiten:

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

Ich denke, es muss ein einfacher Weg sein, aber ich brauche Ihre Hilfe :)

+0

Gute Frage.Da es im Wesentlichen darauf hinausläuft, "wie kann ich eine Eigenschaft als Ref-Parameter übergeben" (Ich sehe keine andere Lösung für Ihr Problem), habe ich mir die Freiheit genommen, Ihre Frage als Duplikat einer anderen Frage zu markieren, die alle Umgehungslösungen erläutert derzeit bekannt. Wenn Sie nicht einverstanden sind, sagen Sie es mir einfach, und ich werde es wieder öffnen. – Heinzi

+0

Ich stimme dir zu, das ist eine sehr nette Antwort - genau das, was ich gesucht habe. Ich frage mich, wie ich das bei Google nie gefunden habe. Wie ich vermutet habe, gibt es auch einen Weg der Reflexion und mein persönlicher Favorit ist derjenige mit dem Ausdruck. –

Antwort

0

(vielleicht Spiegelung?) Zeichenfolgen sind immutable - Sie können eine neue Zeichenfolge erstellen, aber Sie können eine vorhandene Instanz einer Zeichenfolge nicht aktualisieren.

Verwandte Themen