37

考虑我们有一个简单的界面,例如ICar当我将鼠标移到 ICar 表达式上并单击Implement InterfaceVisual Studio 生成下面的实现时。

有没有办法只提供一个在界面上看到的自动属性。这会导致重构问题,每次都让我发疯!

    public interface ICar
    {
        double Power { get; set; }
    }

    public class Car:ICar
    {

        public double Power
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
    }
4

4 回答 4

58

您可以在选项中更改它:工具 > 选项 > 文本编辑器 > C# > 高级,在底部你有

吨

于 2017-07-21T06:23:07.050 回答
24

单击 时需要更改 Visual Studio 使用的模板Implement Interface。模板存储在以下位置:

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;
于 2013-07-17T15:06:21.220 回答
3

首先,这不是自动属性。如果您想要一个自动属性,您必须删除编译器生成的内容并将其替换为

public double Power { get; set; }

是一个自动属性。

编译器这样做是因为它是编译器可以做的最简单的事情,它可以生成可以编译的代码。我想它可以为接口上的属性执行自动属性,但这会在它处理方法的方式(它也会生成NotImplementedException方法存根)和属性之间引入不一致。也就是说,你可以改变它。它在片段中处理:

1)打开snippets目录,找到这个文件 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; }
于 2013-07-17T15:02:13.077 回答
3

如果人们在搜索中尝试这样做是 Visual Studio 2015,则无法修改重构片段。在更新到 Roslyn 之后,Visual Studio 似乎不再真正引用这些片段文件,而是直接在 Roslyn 中进行。

于 2017-03-09T15:13:26.587 回答