14

当我第一次在类中实现接口时,我希望 resharper 6 或 Visual Studio 2010 将我的属性实现为自动实现的属性,而不是放入 throw new NonImplementedException(); 的默认值。我怎样才能做到这一点?例如:

public interface IEmployee
{
// want this to stay just like this when  implemented into class
ID { get; set; }
}

public class Employee : IEmployee
{
// I do not want the throw new NonImplemented exception
// I want it to just appear as an auto implemented property
// as I defined it in the interface
public int ID
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
}

因为这种情况一直在发生,我发现自己不得不不断重构并手动删除那些抛出新的 UnImplimented() 异常并手动使属性自动实现......很痛苦!毕竟,我在我的界面中将它定义为一个自动实现的属性。

非常感谢任何帮助或建议!谢谢。

4

7 回答 7

7

Note: your R# keyboard shortcuts may differ, I am using the Resharper 2.x keyboard schema.

If you declare the interface on the class and then use Alt+Enter and select “Implement members”:

Selecting “Implement mebers”"></p>

<p>Then you will get the default implementation, which happens to be throwing <code>NotImplementedException</code>, unless you change that.</p>

<p>But if you ignore the suggested course of action and instead use <kbd>Alt</kbd>+<kbd>Insert</kbd> to open the Generate menu, you can select “Missing members”:</p>

<p><img src=

That will do exactly what you want:

class Employee : IEmployee
{
    public int Id { get; set; }
}
于 2012-04-29T14:40:09.227 回答
7

毕竟,我在我的界面中将它定义为一个自动实现的属性。

不,你没有。您将其声明为没有实现的属性。这就是你在接口中所能做的一切你只是说实现接口的类必须提供这些属性的具体实现。

就我个人而言,我会警惕接口中有太多可写属性 - 如果这是你发现“一直发生”的事情,我想知道你是否正在使用可能更适合抽象类的接口。

就您的确切问题而言:我不知道是否可以更改 VS 或 R# 为接口提供的默认实现 - 但老实说,无论如何我都会拒绝进行这些更改。

编辑:在 R# 选项“代码生成”下,您可以选择抛出异常、返回默认值或提供不可编译的代码。这可能会做你想做的事。试一试,但我仍然强烈建议您在走这条路之前仔细考虑一下。

于 2012-04-29T12:55:58.020 回答
3

接口并不意味着指定方法将如何实现,因此无法使用接口绕过它。一种解决方案是使用自动实现的属性创建一个抽象基类并继承该类,而不是直接实现接口。

于 2012-04-29T12:57:02.627 回答
3

这是我在 VS2015 中找到的快速解决方法。将您的类标记为抽象,然后抽象地实现接口。这会为您添加自动属性,然后您只需将文件中的“abstract”替换为“”。然后你可以从你的类中删除 abstract 关键字。

于 2016-06-12T13:21:34.850 回答
1

对于 VS2015,我使用查找和替换宏作为解决方法:

Find:
(\r|\n| |\t)+\{(\r|\n| |\t)+get(\r|\n| |\t)+\{(\r|\n| |\t)+throw(\r|\n| |\t)+new(\r|\n| |\t)+NotImplementedException\(\);(\r|\n| |\t)+\}(\r|\n| |\t)+set(\r|\n| |\t)+\{(\r|\n| |\t)+throw(\r|\n| |\t)+new(\r|\n| |\t)+NotImplementedException\(\);(\r|\n| |\t)+\}(\r|\n| |\t)+\}

replace:
 {get;set;}
于 2017-01-27T06:38:46.393 回答
0

除了乔恩的回答...如果您真的想更改 Visual Studio 的这种(开箱即用)行为并在实现接口时创建自动属性,您可以尝试以下之一...

  1. 使用 T4 生成代码 - http://msdn.microsoft.com/en-us/library/bb126445.aspx

  2. 使用 VS SDK 为 Visual Studio 编写一个自定义插件来实现这一点

于 2012-04-29T13:01:44.910 回答
0

它与这个问题并不完全相关,但是,当您在接口中具有多个此类属性时,一种不同的方法,而不是接口,您可以拥有一个类并将该类称为主类中的返回类型。您可以创建一个类并在主类中引用该类。例子

public class Asset
{
    public int AssetTrackingID { get; set; }

    public Category AssetCategoryInfo { get; set; }

    public Manufacturer AssetManufacturerInfo { get; set; }

    public ManufacturerModel AssetModelInfo { get; set; }

    public Status AssetStatusInfo { get; set; }

    public EmployeeDetails AssetEmployeeInfo { get; set; }

    public string AssetNumber { get; set; }

    public string SerialNumber { get; set; }

    public DateTime? AcquiredDate { get; set; }

}

于 2015-12-30T18:35:48.737 回答