2016-12-21 27 views
3

我在各種項目中一起使用PostSharp和ReSharper,特別是利用PostSharp的代碼合同執行以及ReSharper的註釋來實現更好的代碼。如何配置ReSharper接受[Required](來自PostSharp)等同於[NotNull](反之亦然)?

麻煩的是,當談到是否爲空,我最終有很多參數的,等等,聲明看起來像這樣:

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

...爲了既與前執行和註釋後者認爲不能爲空。

是否有其中我可以配置ReSharper的治療到[NOTNULL]用於註釋目的的,或一些其它方法的[必需]屬性作爲等效的存在(我不特別是作爲以一種方式如何)避免爲每個非空參數等重複自己。

+1

據我所知 - 你不能配置它尋找的屬性。您可以使用腳本來生成[此配置文件](https://www.jetbrains.com/help/resharper/2016.1/Code_Analysis__External_Annotations.html),該腳本將使用反射來查找「必需」並在文件中應用正確的規則。雖然不理想。 – Rob

回答

2

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) 
相關問題