使用扩展仅在 StringBuilder 中附加现有 string/values

Appending only existing string/values in StringBuilder using extension

我有这个方法,它按预期工作,如果字符串为空,它不会插入 <string, value>,但是我有一个问题,字符串并不总是存在。如果字符串不存在,我想避免附加任何内容。

public static class StringBuilderExtension
{
    public static void AppendIfNotNull<TValue>(this StringBuilder sb, TValue value, string prefix)
        where TValue : class 
    {
        if (value != null)
        {
            sb.Append(prefix + value);
        }
    }
}

问题是我总是传递字符串键

sb.AppendIfNotNull(" width=\"", component.style.width + "\"");

这将显示为 width="",因为我实际附加了字符串。我怎样才能阻止这种情况发生。

如果我将它包裹在 if 语句中,我可以阻止它出现

if (item.width!= null)
{
    sb.AppendIfNotNull(" width=\"", item.width + "\"");
}

对象示例。 属性 可能存在于一个对象中,但可能不存在于下一个对象中。例如颜色不存在则不追加:

{
    'id': 'Test',
    'type': 'Text',
    'style': {
        'color': 'black'
        'textSize': '12'
    }
},
        {
    'id': 'Test',
    'type': 'Text',
    'style': {
        'textSize': '12'
    }
}

当前方法签名无法做到这一点,但您可以分别传递前缀、您的值和后缀:

public static void AppendIfNotNull<TValue>(this StringBuilder sb, TValue value, string prefix, string suffix)
    where TValue : class 
{
    if (value != null)
    {
        sb.Append(prefix + value + suffix);
    }
}

sb.AppendIfNotNull(item.width, " width=\"", "\"");

您可以简单地将您的添加从 string prefix 更改为接受 TValue 和 returns 的函数 string

public static class StringBuilderExtension
{
    public static void AppendIfNotNull<TValue>(this StringBuilder sb, TValue value, Func<TValue, string> transform)
        where TValue : class 
    {
        if (value != null)
        {
            sb.Append( transform( value ));
        }
    }
}

在这种情况下,只有当您实际拥有有效值时才会调用您的转换

使用它的示例方法可以是

sb.AppendIfNotNull( token.style?.width, value => $" width=\"{value}\"" );

其中 ? 表示有条件的空检查(所以如果 token.style 为空,它也将为空)

我在 dotnetfiddle 中添加了一个小示例,其中我确实删除了泛型类型限制(因为我在 ;) 中输入了数字)