2016-12-21 5 views
3

저는 PostSharp와 ReSharper를 다양한 프로젝트에서 사용하고 있습니다. 특히 PostSharp의 코드 계약 시행과 ReSharper의 주석을 사용하여 더 나은 코드를 얻고 있습니다. 모두 이전에 시행하고 주석을 위해 ...ReSharper를 [Not] (또는 그 반대)와 동등한 [PostSharp]에서 [필수]를 허용하도록 구성하려면 어떻게해야합니까?

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

을 :

문제는 Null 허용에 올 때, 나는 다음과 같이 등의 매개 변수를 많이, 선언으로 끝입니다 후자의 경우 bar은 null 일 수 없습니다.

나는에 관해서는 특정하지 않다 (주석 목적으로, 또는 다른 방법 [NOTNULL]에 해당하는과 [필수] 속성의 존재를 치료하는 ReSharper에서 구성 할 수있는 방법이 있나요 how) 모든 null이 아닌 매개 변수 등에 대해 이와 같이 반복하지 않아도 되는가?

+1

내가 아는 한 - 찾는 속성을 구성 할 수 없습니다. 리플렉션을 사용하여 'Required'를 찾고 파일에 올바른 규칙을 적용하는 [this configuration file] (https://www.jetbrains.com/help/resharper/2016.1/Code_Analysis__External_Annotations.html)을 생성하는 스크립트를 만들 수 있습니다 . 그러나 이상적이지는 않습니다. – Rob

답변

2

this documentation page에 설명 된대로 ReSharper는 "JetBrains.Annotations"이외의 네임 스페이스에 정의 된 경우에도 실제로 사용자 지정 주석을 인식 할 수 있습니다. 따라서 사용자 정의 주석을 정의하고 일부를 대상 요소에 코드 계약을 적용하는 애스펙트 프로 바이더로 변환 할 수 있습니다.

먼저 "ReSharper Options"| "코드 주석"을 클릭하고 "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)