对于这种选择,有没有比'iif'或'?:'更好的方法?

时间:2011-03-21 00:13:15

标签: c# language-design t4 iif

我正处于我的自定义视图引擎中,我希望事情变得更加清晰。到目前为止,我所拥有的最丑陋的部分之一是iif类型功能。最终看起来像这样:

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

编译(它是一个T4模板,所以它只生成C#代码)相当于

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

我可以想到的一种缩短此问题的方法是??运算符,但是当你有类似Comments.Count==0

之类的东西时这没有用

我主要完全控制生成的C#代码以及视图中的语法,那么在我的设计中这样做的更好的方法是什么?我的目标是更具可读性,但也相当简洁。那么我应该在视图引擎中允许哪些语法修改使其看起来更好?

1 个答案:

答案 0 :(得分:2)

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") =}