问题
我经常发现自己手工输入了代码,如下所示:
public class SomeClass
{
readonly ServiceA serviceA;
readonly ServiceB serviceB;
public SomeClass(ServiceA serviceA, ServiceB serviceB)
{
this.serviceA = serviceA.;
this.serviceB = serviceB;
}
}
要求
我想通过具有方法来产生尽可能多的这地节省时间。 我不想使用需要购买的工具。 是可变的,这里唯一的信息是类名和类型的服务。 因此,在这个例子中,我想应该键入类似这样的东西最少的:
- 有些 + 快捷键
-
SomeClass
-
ServiceA
-
ServiceB
- 输入
我也持开放的态度仍然需要我键入的字段名称的解决方案。 我不介意是否private
访问修饰符是存在于字段定义,但我宁愿没有,因为它的代码是有点精简的方式。 同样的,我愿意接受,不会产生只读领域的解决方案,但我不喜欢他们,因为我很少想我的类被初始化后更改的服务。
我已经试过
我知道的最快的解决办法,此刻是在另一段代码来键入类似以下内容并告诉Visual Studio来创建其使用的类和构造。
new SomeClass((ServiceA)null, (ServiceB)null);
不过,我并不总是在这个顺序工作; 有时我想使用它之前创建一个类。 所以我通常做的是这样的:
- 调用
ctor
的代码片断。 - 填写构造函数体。
- 使用的CodeRush随心产生的字段。 (它提供了一种方法来生成只读字段,而Visual Studio中,不使他们只读。)
代码片段工作得很好,但我不认为他们支持的参数变量数目,所以他们很可能不适合于这个问题。
转到您的默认的C#代码片段位置,一般在C:\ Program Files文件(x86)的\微软的Visual Studio 10.0 \ VC#\片段\ 1033 \ Visual C#和使ctor.snippet的拷贝到你的个人代码片段的位置,重命名它,并给它一个恰当的名称和快捷键。 然后更改声明(看看其他现有的),像下面可以做的工作。 一旦你创建它,你可以简单地输入svc + TAB
在一个空的类文件(或任何快捷键选择,然后按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>
在上面我们声明变量的类svcA = ServiceA
, svcB = ServiceB
,类变量svcAvar = serviceA
和svcBvar = serviceB
,所以我们可以很容易地修改在一个位置,你可以在构造等创造更多的PARAMS ,但应该足以让你开始。
关于则params的可变数量,你可以使用默认的PARAMS字面那么这将让你输入你需要的任何PARAMS你插入的构造函数后,如果您有不同类级变量,然后就像其他人所说,创建几个片段与不同快捷键,如SVC,svc1,svc2,svc3等
<Literal>
<ID>params</ID>
<ToolTip>Parameter list</ToolTip>
<Default></Default>
</Literal>
然后...<![CDATA[$accessor$ $classname$ (...$params$)
文章来源: How can I automatically generate a constructor that receives and stores services for free?