如何使接口的实现产生auto属性而不是NotImplementedException?
考虑到当我将鼠标移动到ICar表达式上并点击Implement Interface
Visual Studio时,我们有一个简单的接口,如ICar
。
有没有办法在界面上提供一个自动属性。 这导致重新分解问题,每次都让我发疯!
public interface ICar { double Power { get; set; } } public class Car:ICar { public double Power { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } }
单击“ 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;
您可以在选项中更改它:工具>选项>文本编辑器> C#>高级,并在您的底部
首先,那不是自动财产。 如果需要自动属性,则必须删除编译器生成的内容并将其替换为
public double Power { get; set; }
那是一个自动财产。
编译器这样做是因为编译器可以做的最简单的事情是产生将编译的代码。 我认为它可以为接口上的属性执行自动属性,但这会在它处理方法(它还将生成NotImplementedException
方法存根)和属性之间引入不一致。 也就是说,你可以改变这一点。 它是在片段中处理的:
1)打开片段目录并找到此文件C:\Program Files\Microsoft Visual Studio 10.0\VC#\Snippets\1033\Refactoring\PropertyStub.snippet
2)修改PropertyStub.snippet
文件,用。替换属性存根
您可以对MethodStub.snippet
执行相同操作,以便生成空体。
现在,当您使用Visual Studio自动实现接口时,您最终会得到
public double Power { get; set; }
如果人们进入搜索尝试这样做是Visual Studio 2015,则无法修改重构片段。 在更新到Roslyn之后,看起来Visual Studio从未实际引用过这些片段文件,而是直接在Roslyn中完成。