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 :)
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
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. –