Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将ReSharper配置为接受[Required](来自PostSharp)等同于[NotNull](或反之亦然)?_C#_Resharper_Custom Attributes_Postsharp - Fatal编程技术网

C# 如何将ReSharper配置为接受[Required](来自PostSharp)等同于[NotNull](或反之亦然)?

C# 如何将ReSharper配置为接受[Required](来自PostSharp)等同于[NotNull](或反之亦然)?,c#,resharper,custom-attributes,postsharp,C#,Resharper,Custom Attributes,Postsharp,我在各种项目中同时使用PostSharp和ReSharper,具体来说,为了更好的代码,我利用了PostSharp的代码契约执行和ReSharper的注释 问题是,当涉及到可空性时,我最终得到了大量的参数等声明,如下所示: public void Foo ([Required] [JetBrains.Annotations.NotNull] object bar) …为了对前者进行强制,并对后者进行注释,bar不能为空 是否有一种方法可以配置ReSharper,将[Required]属性的存在

我在各种项目中同时使用PostSharp和ReSharper,具体来说,为了更好的代码,我利用了PostSharp的代码契约执行和ReSharper的注释

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

public void Foo ([Required] [JetBrains.Annotations.NotNull] object bar)
…为了对前者进行强制,并对后者进行注释,bar不能为空

是否有一种方法可以配置ReSharper,将[Required]属性的存在视为等同于[NotNull]用于注释目的,或者使用某种其他方法(我不太清楚如何)来避免对每个非null参数重复这样的操作,等等?

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

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

然后创建一个新的代码文件并粘贴注释。您可以重命名名称空间(例如,
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 );
    }
}

AlexD从技术上回答了这个问题,但这仅仅是因为在最初的问题中有一个不好的假设。PostSharp.Required属性与JetBrains.NotNull不等效。NotNull就是这个意思,而Required既不是null也不是空的


AlexD的方法是修改JetBrains NotNull属性,使其行为类似于必需的属性,并使用该属性。但是JetBrains没有与Required等效的属性,因此如果您想保留“not null”和“not null or empty”的两个不同属性,并且这两个属性都受到Resharper的尊重,那么这种方法就无法工作。

据我所知,您无法配置它所查找的属性。您可以生成一个脚本,该脚本将使用反射来查找
Required
,并在文件中应用正确的规则。但这并不理想。
public void Foo ([MyAnnotations.NotNull] object bar)