开发者

Is there a better way than 'iif' or '?:' for this kind of choosing?

I'm at a point in my custom view engine that I want things to be a bit cleaner. One of the ugliest parts I have so far is iif type functionality. It ends up looking like this:

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

which compiles(it's a T4 template, so it just generates C# code) to the equivalent of

Write(CssClass==null ? "" : "class=\""+CssC开发者_如何学Pythonlass+"\"");

One way of shortening this I can think of is the ?? operator, but that doesn't help when you have something like Comments.Count==0

I have mostly full control over the generated C# code and what the syntax looks like in a view, so what would be a better way to do this in my design? I'm aiming for something more readable, but also fairly concise. So what syntax modifications should I allow in my view engine to make it looks better?


Can T4 make use of extension methods?

This is a bit nasty, but it will make the code above a bit more readable. We can make use of the fact that extension methods work even on null references:

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

So now your code looks like this:

{= CssClass.ToClassAttribute() =}

If you find that this is too specific and you're doing a lot of HTML attributes as strings like this, you could make a slightly more general version:

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

So you could do this sort of thing:

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

etc.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜