2009-03-20 5 views
2

나는 Lokad Shared Libraries을 시험해보고 있으며 매우 흥미롭고 유용합니다. 예를 들면 다음과 같습니다 :C#, Lokad.Shared : Enforce와 함께 사용할 사용자 지정 규칙을 작성하는 방법

Enforce.Arguments(() => arg1,() => arg2); 

arg1 또는 arg2가 null 인 경우 예외를 throw 할 수 있습니다. 하지만 IEnumerable에 적어도 하나 이상의 항목이 있는지 확인하고 싶습니다. 다음과 같이 사용할 수 있습니다 :

Enforce.That(someSequence.Count() > 0); 

그러나 매우 유용한 오류 메시지가 생성되지는 않습니다. 필자는 샘플 코드 등을보고 사용자 정의 규칙을 작성하고 사용하는 방법을 알아 내려고 노력했습니다. 그러나 나는 단지 그것을 이해하는 것처럼 보일 수 없다! 내가 여기까지 온

(또는 짧은 ... 더 정확하게는 ...). 나는 내 규칙을 수집하는 클래스를 만들어야합니다

  • 나는 어떻게 든을 필요가 있다고 생각 Lokad.Rules.Rule<T> 대리인을 만드시겠습니까? 아마도 그 무엇이든 IScope, 뭔가를 할 필요가
  • .... 내가 아주 확실하지 않지만
  • 그 다음은 어떻게 든 적용 방법 중 하나를 사용하여 해당 규칙을 사용하는 방법 ...
도움을 줄 수

public static void DoStuff<T>(this IEnumerable<T> subjects) 
{ 
    Enforce.Argument(() => subjects); 
    // Somehow in an equally smooth way check that 
    // subjects contains at least one element 

    // Do stuff 
} 

사람 :

그래서 이것이 내가 끝낼 할 것입니다, 정리해?

+0

나 ' 로카드에 대해 들어 본적이 없어요.이 전에 쉐어. +1 흥미로운 신기술! –

+0

그래, 이제 막 사용하기 시작했지만이 Rinat Abdullin 사람의 RSS 피드를 따라 왔습니다. 흥미로운 것들이 많이 있습니다. Express 및 Reflect 수업과 마찬가지입니다. – Svish

+0

여기에서 동일합니다. 나는 당신이 속성 이름을 제공 할 필요가없는 Guard 문을 작성하려고 할 때 찾아왔다. 정말이 작품을 파고. –

답변

1

a blog post에 같은 질문이있는 질문 대상 종류는 Rinat Abdullin입니다. 이 대답을 얻었다 :

public static class EnumerableIs 
    { 
     public static void NotEmpty<T>(IEnumerable<T> collection, IScope scope) 
     { 
      if (!collection.Any()) 
      { 
       scope.Error("Enumerable can't be empty."); 
      } 
      scope.ValidateInScope(collection); 
     } 
    } 

    [Test, ExpectedException(typeof(ArgumentException))] 
    public void Test() 
    { 
     IEnumerable<object> t = null; 
     Enforce.Argument(() => t, EnumerableIs.NotEmpty); 
    } 

    [Test, ExpectedException(typeof(ArgumentException))] 
    public void Test2() 
    { 
     var t = new int[0]; 
     Enforce.Argument(() => t, EnumerableIs.NotEmpty); 
    } 

    [Test, ExpectedException(typeof(ArgumentException))] 
    public void Test3() 
    { 
     var t = new[] { new object(), null }; 
     Enforce.Argument(() => t, EnumerableIs.NotEmpty); 
    } 

을 그리고 이것은 실제로 일을 :

다음은 용도와 간단한 구현입니다. 시험 방법은이 메시지와 함께 예외를 throw :

Test1 파일 : 유형의 객체 'IEnumerable`1는'null는 불가합니다. 매개 변수 이름 : t

Test2 : 열거 형은 비워 둘 수 없습니다. 매개 변수 이름 : t

Test3 : 'Object'유형의 객체는 null이 아니어야합니다. 매개 변수 이름 : t. 1

NotEmpty<T> 방법이 검사 어디에서 Test1 및 테스트 3 그래서 난 그것에 대해 물었다 ... 같은 ...하지만에서 자신의 메시지를 어디서 얻었 아주 확실하지 ...

관련 문제