当我第一次在一个类中实现一个接口时,我想要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()异常并手动使属性自动实现......痛苦!毕竟,我在界面中将其定义为自动实现的属性。
任何帮助或建议非常感谢!感谢。
答案 0 :(得分:7)
毕竟,我在界面中将其定义为自动实现的属性。
不,你没有。您将其声明为没有实现的属性。这就是你可以在接口中做的所有事情:你只是说实现接口的类必须提供这些属性的具体实现。
就个人而言,我会担心在接口中有太多可写属性 - 如果这是你发现“一直发生”的事情我想知道你是否正在使用可能是抽象类的接口更合适。
就您的确切问题而言:我不知道是否可以更改VS或R#为接口提供的默认实现 - 但我还是会拒绝进行这些更改,说实话。
编辑:在R#选项“代码生成”下,您可以选择抛出异常,返回默认值或提供无法编译的代码。 可能这可以做你想要的。试一试,但我仍然强烈建议你在走这条路之前仔细考虑。
答案 1 :(得分:7)
注意:您的R#键盘快捷键可能有所不同,我使用的是Resharper 2.x键盘架构。
如果在类上声明接口,然后使用 Alt + Enter 并选择“实施成员”:
然后你会得到默认的实现,恰好抛出NotImplementedException
,除非你改变它。
但是如果你忽略建议的行动方案而是使用 Alt + 插入来打开Generate菜单,你可以选择“Missing members”:
这将打开Generate窗口,您可以在其中选择将属性(或属性)实现为自动实现:
这将完全符合您的要求:
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的这个(开箱即用)行为并在实现接口时创建自动属性,你可以尝试以下其中一个......
使用T4生成代码 - http://msdn.microsoft.com/en-us/library/bb126445.aspx
使用VS SDK为Visual Studio编写自定义插件实现此目的
答案 6 :(得分:0)
然而,当你在一个接口中有多个这样的属性时,它与这个问题完全无关,而不是接口,你可以拥有一个类,并将该类作为主类中的返回类型引用。您可以创建一个类并在主类中引用该类。示例
getEvents
}