理想与现实之间

学习的最好方法就是blog

博客园 首页 新随笔 联系 订阅 管理
  68 Posts :: 2 Stories :: 429 Comments :: 12 Trackbacks
上篇文章里,我向大家介绍了在VS2005的IDE中,利用code expansion功能,自动生成Property的方法,事实上,在VS2005里已经预制了相当多的用来代码扩展(Code Expansion)的代码片断(Code Snippet),"prop"就是一个例子。在Tools菜单下,有一个叫作Code Snippets Manager的工具,在里面可以看到预定义的所有的Code Snippet。

那么我们是不是可以自定义一个Code Snippet用来作Code Expansion呢?经过试验,答案是肯定的!下面我们来看一下怎么完成这个工作。

首先,每个Code Snippet都对应了一个XML文件。在Code Snippets Manager中,我们可以看到这些XML的存放地点。如图:



打开这个XML文件,可以看到如下的内容:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippet Format="1.0.0">
    
<Header>
        
<Title>property</Title>
        
<Shortcut>prop</Shortcut>
        
<Description>Generate property and backing field</Description>
        
<SnippetTypes>
            
<SnippetType>Expansion</SnippetType>
        
</SnippetTypes>
    
</Header>
    
<Snippet>
        
<Declarations>
            
<Literal default="true">
                
<ID>type</ID>
                
<ToolTip>Property type</ToolTip>
                
<Default>int</Default>
            
</Literal>
            
<Literal>
                
<ID>property</ID>
                
<ToolTip>Property name</ToolTip>
                
<Default>MyProperty</Default>
            
</Literal>
            
<Literal>
                
<ID>field</ID>
                
<ToolTip>The variable backing this property</ToolTip>
                
<Default>myVar</Default>
            
</Literal>
        
</Declarations>
        
<Code Language="csharp" Format="CData"><![CDATA[private $type$ $field$;

    public $type$ $property$
    {
        get { return $field$;}
        set { $field$ = value;}
    }
    $end$
]]>
    
</Code>
    
</Snippet>
</CodeSnippet>


我来解释一下其中主要的标签的作用:

<Shortcut>prop</Shortcut> 

定义了用来扩展的缩写是prop

<SnippetTypes>
       
<SnippetType>Expansion</SnippetType>
</SnippetTypes>

定义了这个Snippet是用来作Code Expansion的。SnippetType的可能的取值还有

<SnippetType>SurroundsWith</SnippetType> 

你猜得没错这个就是用来设置Intellisense中的Surround With的功能的。一个Snippet可以同时拥有这两个类型。

<Declarations>标签中定义了扩展之后,需要用户填写的部分。每个<Literal>标签定义一个变量。<Default>定义了默认的取值。

最重要的就是<Code>中的内容了,这个就是扩展后的样子了。

下面我写了一个用来自动扩展出一个NUnit的TestFixture的Code Snippet。

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippet Format="1.0.0">
    
<Header>
        
<Title>TestFixture</Title>
        
<Shortcut>tstFix</Shortcut>
        
<Description>Expansion snippet for Test Fixture class</Description>
        
<SnippetTypes>
            
<SnippetType>Expansion</SnippetType>
        
</SnippetTypes>
    
</Header>
    
<Snippet>
        
<Declarations>
            
<Literal default="true">
                
<ID>name</ID>
                
<ToolTip>Class name</ToolTip>
                
<Default>MyClass</Default>
            
</Literal>
        
</Declarations>
        
<Code Language="csharp" Format="CData"><![CDATA[
    [TestFixture]
    class $name$
    {
        $end$
    }
    
]]>
        
</Code>
    
</Snippet>
</CodeSnippet>

注意在这里,我在<Code>中使用了$end$这个预设的变量,这个变量表明了在输入完所有的Literal之后,光标将停留的位置。

写完了之后,将这个XML文件保存到一个新建的目录。然后在Code Snippets Manager中,加入这个目录,然后就可以在IDE中使用这个Code Snippet了。

现在,按下tstFix之后按Tab键,就会自动生成一个带有[TestFixture]属性的类了。

大家还可以按照这个方法去试一下Surround With的功能。


posted on 2004-10-27 21:48 Justin Shen 阅读(...) 评论(...) 编辑 收藏