Есть ли лучший способ, чем «iif» или «?:» Для такого выбора? - PullRequest
2 голосов
/ 21 марта 2011

Я нахожусь в своем механизме просмотра, который хочет, чтобы все было чище. Одна из самых уродливых частей, которые у меня есть, это функциональность типа iif. В конечном итоге это выглядит так:

{= CssClass==null ? "" : "class=\""+CssClass+"\"" =}

, который компилируется (это шаблон T4, поэтому он просто генерирует код C #) в эквивалент

Write(CssClass==null ? "" : "class=\""+CssClass+"\"");

Один способ сократить это, я могу придумать, это оператор ??, но это не помогает, когда у вас есть что-то вроде Comments.Count==0

У меня в основном полный контроль над сгенерированным кодом C # и как выглядит синтаксис в представлении, так что бы я мог сделать лучше в моем проекте? Я стремлюсь к чему-то более читабельному, но также достаточно лаконичному. Итак, какие модификации синтаксиса я должен разрешить в своем движке вида, чтобы он выглядел лучше?

1 Ответ

2 голосов
/ 21 марта 2011

Может ли T4 использовать методы расширения?

Это немного неприятно, но сделает приведенный выше код более читабельным. Мы можем использовать тот факт, что методы расширения работают даже с пустыми ссылками:

public static class MyStringExtensions
{
    public static string ToClassAttribute(this string s)
    {
        return String.IsNullOrWhiteSpace(s) ? String.Empty : "class=\"" + s + "\"";
    }
}

Итак, теперь ваш код выглядит так:

{= CssClass.ToClassAttribute() =}

Если вы обнаружите, что это слишком специфично, и вы используете множество атрибутов HTML в виде таких строк, вы можете сделать более общую версию:

public static class MyStringExtensions
{
    public static string ToAttribute(this string s, string attribute)
    {
        return String.IsNullOrWhiteSpace(s) ? String.Empty : attribute + "=\"" + s + "\"";
    }
}

Так что вы могли бы сделать такую ​​вещь:

{= CssClass.ToAttribute("class") =}
{= CssStyle.ToAttribute("style") =}

и т.д.

...