用扩展方法替换字符串值

时间:2016-06-14 15:21:57

标签: c# extension-methods

所以我基本上做的就是解析一条消息(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);

最优雅的#34;到目前为止我可以提出这个问题,忽略了""意味着将数据库对象的值设置为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);

我认为必须有一种更简单的方法,但我需要你的帮助(也许反思?):)

1 个答案:

答案 0 :(得分:0)

字符串为immutable - 您可以创建新字符串,但无法更新字符串的现有实例。