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) 制作片段标记代码,或者(如果您感觉 真的 雄心勃勃)您主动匹配代码针对片段,无论它们最初是否来自片段,并对匹配的树进行操作。虽然功能强大,但如果有人真的只是想更改部分代码,它可能会让人大吃一惊。

...所以简短的回答是否定的。