当我将鼠标移到ICar表达式上并单击ICar
Visual Studio生成以下实现时,请考虑我们有一个简单的界面,例如Implement Interface
。
有没有办法在界面上提供一个自动属性。这导致重新分解问题,每次都让我发疯!
public interface ICar
{
double Power { get; set; }
}
public class Car:ICar
{
public double Power
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
}
答案 0 :(得分:25)
单击Implement Interface
时,需要更改Visual Studio使用的模板。模板存储在以下位置:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC#\Snippets\1033\Refactoring
您需要更改的模板名为PropertyStub.snippet
注意:我会在进行更改之前备份现有的代码段文件,以便在事情不顺利的情况下轻松恢复。
您需要更新的行是:
$GetterAccessibility$ get
{
$end$throw new $Exception$();
}
$SetterAccessibility$ set
{
throw new $Exception$();
}
这些行应改为:
$GetterAccessibility$ get;
$SetterAccessibility$ set;
答案 1 :(得分:19)
答案 2 :(得分:3)
首先,那不是自动财产。如果需要自动属性,则必须删除编译器生成的内容并将其替换为
public double Power { get; set; }
那是一个自动财产。
编译器这样做是因为编译器可以做的最简单的事情就是产生可编译的代码。我认为可以为接口上的属性执行自动属性,但这会在它处理方法之间引入不一致(它将还生成NotImplementedException
方法存根)和属性。也就是说,你可以改变这一点。它是在片段中处理的:
1)打开代码段目录并找到此文件
C:\Program Files\Microsoft Visual Studio 10.0\VC#\Snippets\1033\Refactoring\PropertyStub.snippet
2)修改PropertyStub.snippet
文件,用
<![CDATA[$signature$ { $GetterAccessibility$ get; $SetterAccessibility$ set; }]]>
您可以对MethodStub.snippet
执行相同操作,以便生成空正文。
现在,当您使用Visual Studio自动实现界面时,您将最终得到
public double Power { get; set; }
答案 3 :(得分:2)
如果有人来搜索尝试这样做是Visual Studio 2015,则无法修改重构片段。在更新到Roslyn之后,看起来Visual Studio从未实际引用过这些片段文件并直接在Roslyn中进行。