【问题标题】:Visual Studio Project/Item Template Parameter LogicVisual Studio 项目/项目模板参数逻辑
【发布时间】:2011-10-06 05:56:39
【问题描述】:

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

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

在模板的任何文件中(除了模板文件本身),您都可以根据参数添加逻辑。只有三个关键字与逻辑一起使用。 $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$。

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

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

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

希望这对某人有所帮助。

【问题讨论】:

  • 问题是——你为什么要强迫自己使用项目模板机制来执行这种条件?模板的存在是为了一个非常恒定的基本起点,而不是为了创建具有基于用户提供的选项的逻辑的复杂类(这很难维护)。
  • 你用什么版本的 Visual Studio 测试过这个?我一直在 Visual Studio 2008 中与它作斗争,虽然 $parameter$ 替换工作得很好,但 $if$/$else$/$endif$ 关键字似乎完全被忽略了。如果我输入“$if$ ($targetframeworkversion$ == 3.5)using System.Linq;$endif$”之类的内容,我会输出“$if$ (3.5 == 3.5)using System.Linq;$endif$” .
  • 经过大量研究,这在 Visual Studio 2008 中确实有效,但它非常古怪,需要 .vstemplate 文件中的“神奇”XML 指令:<VSTemplate Type="Item" Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">。注意那里的关键3.0.0。模板中的空白也有很多其他怪癖。更多信息可以在这个线程中找到:stackoverflow.com/questions/1220389/…
  • 您应该以问答格式编写此内容,以帮助人们搜索问题。
  • 我一直找不到“不”。我使用的解决方法是使用“$else$”或简单地制作“false/no”等参数字符串。

标签: visual-studio logic project-template


【解决方案1】:

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

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

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 环境。下面的例子展示了if(foo){...if(bar){...if(baz){...}...}...}的3层嵌套:

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;
}

【讨论】:

    【解决方案2】:

    对于逻辑andor
    and 是:
    &&
    or 是:
    ||

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

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

    其中带有or 的 if 语句如下所示:

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

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

    (我使用的是 VisualStudios 2017)

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-01-12
      • 1970-01-01
      • 2014-08-17
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多