2010-05-16 4 views
1

특성을 사용하여 SomeAttribute를 호출하고 클래스에서 SomeAttribute가있는 형식이 전달되는지 확인해야합니다. 그래서 내가 지금 그것을 할 방법은 다음과 같습니다C# : 매개 변수가 있는지 확인

public class Test() 
{ 
    public Test(SomeType obj) 
    { 
     if(!obj.GetType().IsDefined(typeof(SomeAttribute), false)) 
     { 
      throw new ArgumentException("Errormessage"); 
     } 
    } 
} 

하지만이 obj가 속성이없는 경우 나, 어딘가 런타임에 컴파일시 오류를하지 않는 것을 의미한다. 메서드 선언에 매개 변수에 일부 특성이 있어야한다고 지정하는 방법이 있습니까? 그래서 내가 잘못된 매개 변수를 사용할 때 컴파일 시간을 얻거나 빈 인터페이스를 사용해야합니까?

답변

1

아니요, 속성을 요구할 방법이 없습니다.하지만 수 있다고 가정하면이 실제로이 요구 사항을 감지 할 수 있도록 어셈블리를 검사하고 적절한 속성이 적용되었는지 확인하기위한 단위 테스트를 작성할 수 있습니다.

다소 이상하게 들릴 수 있습니다. 왜이 구성표를 사용하는지 자세히 설명해 주시겠습니까? 관심있는 추가 데이터를 설명하는 또 다른 매개 변수와 같은 다른 접근 방식이 더 적절할 것입니다.

+0

실제로 코드 계약을 사용하여이 작업을 수행 할 수있는 방법이 있는지 궁금합니다. 나는 그들과의 경험이 거의 없지만 런타임 전용 조건의 컴파일 타임 검사를 허용합니다. – Josh

+0

개체를 표시하기 위해이 개체를 사용하여 특정 형식인지 확인하고 빈 인터페이스를 사용하는 것은 나쁜 습관이므로 속성을 사용하여 읽었습니다. 유형은 아무 것도 구현할 필요가 없습니다. – slayerIQ

+0

빈 인터페이스가 나쁜 습관이라고 생각하지 않습니다.이 인터페이스는 완벽한 솔루션입니다. 그러나 "어떤 유형"이 실제로 의미하는 것은 무엇입니까? 객체가 아무것도 구현하지 않아도된다면 (무언가로 표시 만되어있다.), 당신의 메소드는 무엇을 할 것인가? –

3

컴파일 타임에 특성을 적용 할 방법이 없습니다. 디자인을 재검토하고 싶을 수 있습니다. 일반적으로 속성은 메타 데이터에 대한 것이고 런타임 동작에 대한 것입니다.

NDepend's Code Query Language아마 위반을 감지 할 수있는 정적 anlysis 도구입니다 -하지만 당신은 이미 NDepend를 사용하지 않는 경우, 나 혼자이 요구 사항을 위해 그것을 포함 주저 것.

다시, 당신이하고 싶은 것에 대한 컨텍스트가 부족합니다. 이것은 마치 solving the other half your problem과 같습니다.

관련 문제