Visual Studio 代码片段重构
Visual Studio Code Snippet Refactoring
我创建了以下简单代码段
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets
xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Observable Property</Title>
<Description>Generates an Observable property based on type and Name</Description>
<Shortcut>nosp</Shortcut>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>PropertyName</ID>
<ToolTip>Defines the Property Name</ToolTip>
<Default>Name</Default>
</Literal>
<Literal>
<ID>PropertyType</ID>
<Type>Type</Type>
<ToolTip>Defines the Property Type</ToolTip>
<Default>String</Default>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[
public $PropertyType$ $PropertyName$
{
get { return Get<$PropertyType$>("$PropertyName$"); }
set
{
Set("$PropertyName$", value);
}
}
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
并且它按预期工作以创建示例
public VirtualKeyCode Key
{
get { return Get<VirtualKeyCode>("Key"); }
set
{
Set("Key", value);
}
}
是否可以更改所有 $PropertyType$ 位置,例如在重构期间初始插入代码段后更改其中一个位置?
没有。片段只是生成文本的一种快速方式。一旦插入,VS 就会失去所有关于它的知识和上下文。当然,您可以简单地重新插入具有正确类型的代码段,但是任何重构都无法知道代码来自代码段。
如果您感觉特别雄心勃勃,您可以尝试编写一个 Roslyn 扩展来跟踪哪些代码部分来自片段变量,并进行片段感知重构以更改所有变量实例。即便如此,这也无法跨会话工作,除非您使用评论 (// snippet: Observable Property
) 制作片段标记代码,或者(如果您感觉 真的 雄心勃勃)您主动匹配代码针对片段,无论它们最初是否来自片段,并对匹配的树进行操作。虽然功能强大,但如果有人真的只是想更改部分代码,它可能会让人大吃一惊。
...所以简短的回答是否定的。
我创建了以下简单代码段
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets
xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Observable Property</Title>
<Description>Generates an Observable property based on type and Name</Description>
<Shortcut>nosp</Shortcut>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>PropertyName</ID>
<ToolTip>Defines the Property Name</ToolTip>
<Default>Name</Default>
</Literal>
<Literal>
<ID>PropertyType</ID>
<Type>Type</Type>
<ToolTip>Defines the Property Type</ToolTip>
<Default>String</Default>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[
public $PropertyType$ $PropertyName$
{
get { return Get<$PropertyType$>("$PropertyName$"); }
set
{
Set("$PropertyName$", value);
}
}
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
并且它按预期工作以创建示例
public VirtualKeyCode Key
{
get { return Get<VirtualKeyCode>("Key"); }
set
{
Set("Key", value);
}
}
是否可以更改所有 $PropertyType$ 位置,例如在重构期间初始插入代码段后更改其中一个位置?
没有。片段只是生成文本的一种快速方式。一旦插入,VS 就会失去所有关于它的知识和上下文。当然,您可以简单地重新插入具有正确类型的代码段,但是任何重构都无法知道代码来自代码段。
如果您感觉特别雄心勃勃,您可以尝试编写一个 Roslyn 扩展来跟踪哪些代码部分来自片段变量,并进行片段感知重构以更改所有变量实例。即便如此,这也无法跨会话工作,除非您使用评论 (// snippet: Observable Property
) 制作片段标记代码,或者(如果您感觉 真的 雄心勃勃)您主动匹配代码针对片段,无论它们最初是否来自片段,并对匹配的树进行操作。虽然功能强大,但如果有人真的只是想更改部分代码,它可能会让人大吃一惊。
...所以简短的回答是否定的。