【发布时间】: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$。
最后,我还没有找到逻辑的 and 或 or 符号。我只是通过使用逻辑等价来解决这个问题:
和-> $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