使用扩展名仅在StringBuilder中附加现有的字符串/值

时间:2019-05-01 12:29:07

标签: c# stringbuilder

我有此方法,该方法按预期工作,如果string为空,它不会插入<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'
    }
}

2 个答案:

答案 0 :(得分:2)

您可以将添加的内容从string prefix更改为接受TValue并返回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上添加了一个小样本,其中确实删除了通用类型限制(因为我在;里加了数字))

答案 1 :(得分:0)

无法使用当前方法签名来实现,但是您可以分别传递前缀,您的值和后缀:

myname