1

问题

我经常发现自己手动输入如下代码:

public class SomeClass
{
    readonly ServiceA serviceA;
    readonly ServiceB serviceB;

    public SomeClass(ServiceA serviceA, ServiceB serviceB)
    {
        this.serviceA = serviceA.;
        this.serviceB = serviceB;
    }
}

要求

我想通过尽可能多地生成这种方法来节省时间。我不想使用需要购买的工具。这里唯一可变的信息是类名和服务类型。所以在这个例子中,我想像这样输入一些最小的东西:

  1. Some+Shortcut
  2. SomeClass
  3. ServiceA
  4. ServiceB
  5. Enter

我也愿意接受仍然需要我输入字段名称的解决方案。我不介意private字段定义中是否存在访问修饰符,尽管我更喜欢没有它,因为这样代码会更精简一些。同样,我愿意接受不生成只读字段的解决方案,但我更喜欢它们,因为我很少想在我的类初始化后更改服务。

我试过的

目前我所知道的最快的解决方案是在另一段代码中键入类似以下内容,并告诉 Visual Studio 从其使用中创建类和构造函数。

new SomeClass((ServiceA)null, (ServiceB)null);

但是,我并不总是按这个顺序工作。有时我想在使用它之前创建一个类。所以我通常做的是:

  1. 调用ctor代码片段。
  2. 填写构造函数体。
  3. 使用 CodeRush Xpress 生成字段。(它提供了一种生成只读字段的方法,而 Visual Studio 不会将它们设为只读。)

代码片段运行良好,但我认为它们不支持可变数量的参数,因此它们可能不适合这个问题。

4

1 回答 1

4

转到您的默认 C# 代码片段位置,通常在C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC#\Snippets\1033\Visual C#并将ctor.snippet的副本复制到您的个人代码片段位置,重命名它,并给它一个正确的名称和快捷键。然后更改声明(查看其他现有声明),类似下面的内容可以完成这项工作。一旦你创建了它,你可以简单地svc + TAB在一个空的类文件中输入(或者你选择的任何快捷方式然后选项卡),你应该得到内容填充,或者你可以自定义一个类模板,所以当你添加新的时,您可以选择新模板。

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>Some Constructor</Title>
            <Shortcut>svc</Shortcut>
            <Description>my description</Description>
            <Author>Jason was here</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal>
                    <ID>accessor</ID>
                    <ToolTip>Access modifier</ToolTip>
                    <Default>public</Default>
                </Literal>
                <Literal Editable="false">
                    <ID>classname</ID>
                    <ToolTip>Class name</ToolTip>
                    <Function>ClassName()</Function>
                    <Default>ClassNamePlaceholder</Default>
                </Literal>
                <Literal Editable="true">
                    <ID>svcA</ID>
                    <ToolTip>Service A</ToolTip>
                    <Default>ServiceA</Default>
                </Literal>
                <Literal Editable="true">
                    <ID>svcAvar</ID>
                    <ToolTip>Service A</ToolTip>
                    <Default>serviceA</Default>
                </Literal>
                <Literal Editable="true">
                    <ID>svcB</ID>
                    <ToolTip>Service B</ToolTip>
                    <Default>ServiceB</Default>
                </Literal>
                <Literal Editable="true">
                    <ID>svcBvar</ID>
                    <ToolTip>Service B</ToolTip>
                    <Default>serviceB</Default>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[readonly $svcA$ $svcAvar$;
    readonly $svcB$ $svcBvar$;

    $accessor$ $classname$ ($svcA$ serviceA, $svcB$ serviceB)
    {
        this.$svcAvar$ = serviceA;
        this.$svcBvar$ = serviceB
    }$end$]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

在上面我们声明了 classes svcA = ServiceAsvcB = ServiceB和 class 变量的变量svcAvar = serviceAsvcBvar = serviceB,所以我们可以很容易地在一个位置修改,你可以在构造函数中为 params 创建更多等等,但应该足以让你开始。

关于参数的可变数量,您可以使用默认的参数文字,然后让您在插入 ctor 后键入所需的任何参数,如果您有不同的类级别变量,那么就像其他人所说的那样,创建几个不同的片段快捷方式,例如svcsvc1svc2svc3

<Literal>
    <ID>params</ID>
    <ToolTip>Parameter list</ToolTip>
    <Default></Default>
</Literal>

然后...<![CDATA[$accessor$ $classname$ (...$params$)

于 2013-11-22T22:13:09.333 回答