Добавление только существующих строк / значений в StringBuilder с использованием расширения - PullRequest
0 голосов
/ 01 мая 2019

У меня есть этот метод, он работает как положено, он не вставляет <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 ]

2 голосов
/ 01 мая 2019

Вы можете просто изменить свое добавление с 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 , где я снял ограничение универсального типа (потому что я добавлял числа;))

0 голосов
/ 01 мая 2019

Нет способа сделать это с текущей сигнатурой метода, но вы можете отдельно передать префикс, ваше значение и суффикс:

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=\"", "\"");
...