为 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 后缀,并提供添加它。查看该实现以获得您自己的插件的想法。