2016-08-02 5 views
5

기본적으로 대리인으로 자신을 반환하는 방식으로 함수를 정의 할 수 있습니까?함수 등을 반환하는 함수를 반환하는 함수

public class Scrub 
{ 
    public NotNull NotNull<T>(T value, string name) 
    { 
     if (value == null) throw new ArgumentNullException(name); 
     return NotNull; 
    } 
} 

그럼 내가 할 수있는 체인 방식을 함께 다음과 같이 호출이 올바른 구문 인 경우 예를 들어

.

Scrub.NotNull(param1, nameof(param1))(param2, nameof(param2)(param3, nameof(param3)); 

답변

14

음 그래, 당신은 은 자신의 대리자 선언 할 수 있습니다

delegate SelfReturner<T> SelfReturner<T>(T value, string name); 

static SelfReturner<T> NotNull<T>(T value, string name) 
{ 
    if (value == null) throw new ArgumentNullException(name); 
    return NotNull; 
} 

...하지만 나에게 유용하지 않는 것 같습니다. 세 가지 별도의 전화를하기보다는 실제로이 작업을 수행하려는 이유는 무엇입니까? 예를 들어, null이 아닌 값을 반환하는 Preconditions.CheckNotNull이 있습니다. 솔직히 말하면이 모양보다 훨씬 유용하다는 것을 알았습니다.

주석에서 언급했듯이 모든 매개 변수가 동일한 유형 (또는 모든 매개 변수가 첫 번째 매개 변수의 유형으로 암시 적으로 변환 가능) 인 경우에만 위의 기능이 작동합니다. 두 개의 별도의 방법, 하나는 정적 및 하나

NullChecker.Instance.Scrub(param1, nameof(param1)) 
        .Scrub(param2, nameof(param2)) 
        .Scrub(param3, nameof(param3)); 

:

public sealed class NullChecker 
{ 
    public static NullChecker Instance { get; } = new NullChecker(); 
    private NullChecker() {} 

    public static NullChecker Scrub<T>(T value, string paramName) where T : class 
    { 
     if (value == null) 
     { 
      throw new ArgumentNullException(paramName); 
     } 
     return this; 
    } 
} 

사용 등 : 대안은 일반적인 방법으로 싱글 인스턴스를 사용하는 것 비트 더 많은 작업과 체인 있도록 그렇지 않으면 (다른 이름으로) Instance 부분을 제거 할 수 있습니다. 예를 들어 :

public static class Scrub 
{ 
    public static T NotNull<T, U>(this T value, U property, string name) 
    { 
     if (property == null) throw new ArgumentNullException(name); 
     return value; 
    } 
} 

당신은 할 수 있습니다 :

test.NotNull(test.A, nameof(testA.A).NotNull(test.B, nameof(testA.B))); 

당신이 원하는 그렇진 무엇

NullChecker.Scrub(param1, nameof(param1)) 
      .And(param2, nameof(param2)) 
      .And(param3, nameof(param3)); 
+0

그러나'param1'이 문자열이라면'param2','param3', ... 역시 문자열 일뿐입니다. –

+0

실제로 무엇보다 더 많은 것이 가능했다면 나는 정말로 호기심이 많았다. – adam0101

+1

@IanMercer : 아 맞습니다. 당신 말이 맞습니다. 나는 그것을 고치는 것이 쉽지 않다. 싱글 톤 방법을 사용하는 것이 더 나을 것이다. 그것을 나타 내기 위해 편집 할 것입니다. –

1

당신은 그것을 확장 방법을 확인합니다.

관련 문제