c# - 如何配置 ReSharper 以接受 [Required](来自 PostSharp)等同于 [NotNull](反之亦然)?

标签 c# resharper custom-attributes postsharp

我在各种项目中同时使用 PostSharp 和 ReSharper,特别是利用 PostSharp 的代码契约执行和 ReSharper 的注解以获得更好的代码。

问题是,当涉及到可空性时,我最终得到了很多参数等,声明如下所示:

public void Foo ([Required] [JetBrains.Annotations.NotNull] object bar)

...为了既强制执行前者又注释后者 bar 不能为空。

有没有一种方法可以配置 ReSharper 以将 [Required] 属性的存在视为等同于 [NotNull] 用于注释目的,或其他一些方法(我不特别说明如何)以避免必须为每个非空参数等重复这样的方法?

最佳答案

this documentation page 所述, ReSharper 实际上可以识别自定义注释,即使它们是在“JetBrains.Annotations”以外的命名空间中定义的。因此,您可以定义自己的自定义注释,并将其中的一些注释转换为将代码契约应用于目标元素的方面提供程序。

首先,打开“ReSharper 选项” | “代码注释”并单击“将 C# 实现复制到剪贴板”。此外,取消选中“内部”以跨项目重用注释。

然后新建一个代码文件,贴上注释。您可以重命名命名空间(例如 MyAnnotations)。如果您选择使用自定义命名空间,您需要再次打开“ReSharper 选项”并在“自定义命名空间应在下面的列表中标记”中选中您的自定义命名空间旁边的复选框。

现在您可以找到NotNullAttribute 并按以下方式更改其源代码:

public sealed class NotNullAttribute : LocationLevelAspect, IAspectProvider
{
    public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
    {
        var requiredConstruction = new ObjectConstruction( typeof( PostSharp.Patterns.Contracts.RequiredAttribute ) );
        yield return new AspectInstance( targetElement, requiredConstruction, null );
    }
}

您可以在您的代码中应用此自定义属性,它将同时用作 PostSharp 方面和 ReSharper 注释。

public void Foo ([MyAnnotations.NotNull] object bar)

关于c# - 如何配置 ReSharper 以接受 [Required](来自 PostSharp)等同于 [NotNull](反之亦然)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253375/

相关文章:

c# - 在同一个项目中添加 ASP.NET MVC 和 Web API Web Application

C#教程写小工具

c# - Resharper 自定义插件严重性选项

c# - resharper "Cannot resolve symbol"代码编译好时

c# - 是否有 ReSharper 和 Code Contracts 都可以使用的通用 PureAttribute?

c# - 使用属性在事件上使用目标

c# - 错误 : Object reference not set to an instance of an object. 但在返回 View 中提供了模型

asp.net-mvc-3 - MVC3 : Is it possible to change the result type outside of the code of the action itself?

.net - 自定义 .NET 属性的实际使用

c# - 在 wpf 中为线条装饰器设置动画?