为 C# Contract 创建 Resharper 命名风格 类
Creating a Resharper Naming Style for C# Contract Classes
使用 Microsoft 的代码契约在接口上编写代码契约时,会创建一个包含所有契约的抽象契约class:
using System.Diagnostics.Contracts;
[ContractClass(typeof(ICollectionContract<>))]
public interface ICollection<T> {
// Interface methods
}
[ContractClassFor(typeof(ICollection<>))]
abstract class ICollectionContract<T> : ICollection<T> {
// Interface contracts
}
Microsoft 的惯例是将合约命名为 class 与接口相同,但后缀为 Contract
,例如ICollectionContract<T>
。
然而,Resharper 不喜欢这种命名方式——部分原因是抽象 class.
的 I
前缀
有没有办法创建一种命名风格,告诉 Resharper 合同 classes(那些用 ContractClassFor
注释的)必须与接口同名,但后缀为 Contract
?
这不是您可以配置 ReSharper 开箱即用的东西,您必须创建一个自定义插件。
您必须创建一个 ElementProblemAnalyzer<IInterfaceDeclaration>
,然后检查它是否包含 [ContractClass]
属性,然后确保它具有正确的名称。您还可以创建 QuickFix 建议以重命名界面。
一个好的开始类似于 AsyncSuffix plugin - 它有一个很好的实现,可以分析异步方法以查找缺少的 Async
后缀,并提供添加它。查看该实现以获得您自己的插件的想法。
使用 Microsoft 的代码契约在接口上编写代码契约时,会创建一个包含所有契约的抽象契约class:
using System.Diagnostics.Contracts;
[ContractClass(typeof(ICollectionContract<>))]
public interface ICollection<T> {
// Interface methods
}
[ContractClassFor(typeof(ICollection<>))]
abstract class ICollectionContract<T> : ICollection<T> {
// Interface contracts
}
Microsoft 的惯例是将合约命名为 class 与接口相同,但后缀为 Contract
,例如ICollectionContract<T>
。
然而,Resharper 不喜欢这种命名方式——部分原因是抽象 class.
I
前缀
有没有办法创建一种命名风格,告诉 Resharper 合同 classes(那些用 ContractClassFor
注释的)必须与接口同名,但后缀为 Contract
?
这不是您可以配置 ReSharper 开箱即用的东西,您必须创建一个自定义插件。
您必须创建一个 ElementProblemAnalyzer<IInterfaceDeclaration>
,然后检查它是否包含 [ContractClass]
属性,然后确保它具有正确的名称。您还可以创建 QuickFix 建议以重命名界面。
一个好的开始类似于 AsyncSuffix plugin - 它有一个很好的实现,可以分析异步方法以查找缺少的 Async
后缀,并提供添加它。查看该实现以获得您自己的插件的想法。