在将接口实现到类中时如何创建自动实现的属性?

时间:2012-04-29 12:52:31

标签: c# class properties interface

当我第一次在一个类中实现一个接口时,我想要resharper 6或visual studio 2010将我的属性实现为自动实现的属性,而不是put 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()异常并手动使属性自动实现......痛苦!毕竟,我在界面中将其定义为自动实现的属性。

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

7 个答案:

答案 0 :(得分:7)

  

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

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

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

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

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

答案 1 :(得分:7)

注意:您的R#键盘快捷键可能有所不同,我使用的是Resharper 2.x键盘架构。

如果在类上声明接口,然后使用 Alt + Enter 并选择“实施成员”:

Selecting “Implement mebers”

然后你会得到默认的实现,恰好抛出NotImplementedException,除非你改变它。

但是如果你忽略建议的行动方案而是使用 Alt + 插入来打开Generate菜单,你可以选择“Missing members”:

Selecting “Missing members”

这将打开Generate窗口,您可以在其中选择将属性(或属性)实现为自动实现:

Generate window

这将完全符合您的要求:

class Employee : IEmployee
{
    public int Id { get; set; }
}

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

答案 4 :(得分: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;}

答案 5 :(得分:0)

除了Jon的答案之外......如果你真的想要改变Visual Studio的这个(开箱即用)行为并在实现接口时创建自动属性,你可以尝试以下其中一个......

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

  2. 使用VS SDK为Visual Studio编写自定义插件实现此目的

答案 6 :(得分:0)

然而,当你在一个接口中有多个这样的属性时,它与这个问题完全无关,而不是接口,你可以拥有一个类,并将该类作为主类中的返回类型引用。您可以创建一个类并在主类中引用该类。示例

getEvents

}