38

由于我只看到了一些关于该主题的帖子,但没有深入解释 Visual Studio 模板中参数的逻辑,所以我想我会在这里发布。

MSDN 文章之后,您可以将自定义参数添加到模板中,如果您想更改它们,可以使用向导进行更改。

在模板的任何文件(除了模板文件本身)中,您都可以根据参数添加逻辑。只有三个关键字与逻辑一起使用。$if$ (%expression%)、$else$ 和 $endif$。所以说我在模板文件中有以下内容:

public string foo( string a )
{
    return string.Format( @"foo( {0} );", a );
}

我们想添加一些逻辑来判断我们是否要检查“a”是空还是空

public string foo( string a )
{
$if$ ( $shouldCheckForNullOrEmpty$ == true )
    if ( !string.IsNullOrEmpty( a ) )
$endif$

    return string.Format( @"foo( {0} );", a );
}

当然,您可能希望为 if 语句添加大括号,因此您可能需要多个逻辑块。

所以这还不算太糟糕,但是有一些技巧。$if$ 检查字符串匹配,即 shouldCheckForNullOrEmpty 必须等于“true”。写 $if$ ($shouldCheckForNullOrEmpty$ == "true") 也很有诱惑力,但这行不通。

带有单个表达式的单个 if 语句非常简单,所以现在来看一个更复杂的示例:

public string foo( string a )
{
$if$ ( $parameterCheckMode$ == ifNullOrEmpty )
    if ( !string.IsNullOrEmpty( a ) )
$else$ $if$ ( $parameterCheckMode$ == throwIfNullOrEmpty )
    if ( string.IsNullOrEmpty( a ) )
        throw new ArgumentException();
$endif$ $endif$

    return string.Format( @"foo( {0} );", a );
}

您可能会说,这是参数模式的 switch 语句。您可能会注意到没有 $elseif$,因此您必须将其设为 $else$ $if$,但必须在末尾添加一个额外的 $endif$。

最后,我还没有找到逻辑的符号。我通过使用逻辑等价来解决这个问题:

和 -> $if$ ( 表达式 1 ) $if$ ( 表达式 2 ) $endif $endif$

或 -> $if$ ( expression1 ) 语句 $else$ $if$ 语句 $endif$ $endif$

希望这可以帮助某人。

4

2 回答 2

1

这篇文章链接自Microsoft 官方文档的 MSBuild 条件,其中包含使用示例。MSBuild 条件的语法并不完全等同于模板$if$语句的工作方式,但它是一个近似值。然而,这里的例子似乎已经过时,或者从一开始就不是完全准确的。经过一些广泛的测试,我发现以下关于模板$if$语句是正确的:

$if$语句永远不能嵌套。其原因是模板引擎处理$if$语句评估为假的情况的方式。当一个$if$表达式的计算结果为假时,引擎将解析直到$endif$它找到下一个并删除其间的所有内容。这意味着当存在嵌套$if$语句时,将是第一个$endif$到达的语句,并且嵌套$if$表达式将在处理之前被删除。使用时也是如此$else$。上面的“问题”中有一些误导性示例,仅在外部$if$语句评估为真的情况下才有效。考虑以下示例,其中外部$if$语句的计算结果不为真:

public void foo()
{
    string str = "";

    $if$ ($true$ == false)
    str = "foo";

    $if$ ($true$ == true)
    str = str + "bar";
    $endif$ //inner

    $endif$ //outer

    return str;
}

运行此模板的结果如下:

public void foo()
{
    string str = "";

    //inner

    $endif$ //outer

    return str;
}

如您所见,第一个之后的所有内容都$endif$保留在代码中。我想出了一个合适的解决方法,它涉及使用 & 运算符和串行 if 语句的组合。

有一个逻辑 & 运算符可以在单个 if 语句中使用。语法如下:

$if$ ($foo$|$bar$ == true|false)

这将评估为$foo$ == true && $bar$ == false。使用两个以上的操作数是有效的,例如$foo$|$bar$|$baz$|... == true|false|etc|...。对这种用法的警告是,您只能对语句中的所有比较使用单个运算符类型(==|!= 无效)。我找不到任何可以与Or操作员相媲美的东西。

把它们放在一起。& 运算符可以与一系列 if 语句一起使用,以创建模拟的嵌套 if 环境。以下示例显示了 3 级嵌套if(foo){...if(bar){...if(baz){...}...}...}

public void foo()
{
    string str = "";

    $if$ ($ext_foo$ == true)
    str = "foo";
    $endif$$if$ ($ext_foo$|$ext_bar$ == true|true)
    str = str + "bar";
    $endif$$if$ ($ext_foo$|$ext_bar$|$ext_baz$ == true|true|true)
    str = str + "baz";
    $endif$$if$ ($ext_foo$|$ext_bar$ == true|true)
    str = str + "bar";
    $endif$$if$ ($ext_foo$ == true)
    str = str + "foo";
    $endif$

    return str;
}
于 2021-10-28T00:56:05.773 回答
0

对于逻辑andandor
and是:
&&
whileor是:
||

因此,带有andin 的 if 语句如下所示:

if ((a != null)&&(a !=""))
{
    Console.Write(a);
}

带有orin 的 if 语句如下所示:

if ((b != null)||(b >= 5))
{
    Console.Write(b);
}

对于模板,您可以将 *.cs 文件导出为模板。它位于项目>导出模板...

(我使用的是 VisualStudios 2017)

希望这会有所帮助。

于 2018-04-10T00:56:34.013 回答