2009-11-19 1 views
3

에 방법을 표시되지 :비주얼 스튜디오 인텔리는 다음과 같은 두 개의 인터페이스 (이 작은 예, 나의 실제 구현이다)을 감안할 때 일반적인 과부하

public static class Require { 
    public static IAssertion<T> That<T>(T value) { 
      ... 
    } 

    public static IStringAssertion That(string value) { 
      ... 
    } 
} 

다음 작업을 수행 할 수 있어야한다 :

public void TestMethod(SomeClass a, string b) { 
    Require.That(a).IsNotNull(); 
    Require.That(b).IsNotNullOrEmpty().Evaluate(SomeMethodThatAcceptsString); 
} 

티를 s 코드가 컴파일되고 실제로 실행됩니다. 심지어 같은 패스 테스트, 설정할 수 있습니다

Assert.IsInstanceOf<IStringAssertion>(Require.That(string.Empty)); 
Assert.IsNotInstanceOf<IStringAssertion>(Require.That(new object()); 

내가으로 실행하고 문제와이 문제의 요점을, 비주얼 스튜디오 2005 인텔리이 둘 사이의 차이를 해결되지 않는 것입니다.

내가 Require.That("...").를 입력하면 내가

 
Evaluate(Predicate predicate) 
IsNull() 
IsNotNullOrEmpty() 

의 목록을 볼 것으로 예상한다 대신 내가 아무것도 볼 수 없습니다.

오버로드에 대해 동일한 메소드 이름을 유지하고 싶습니다. IAssertion 인터페이스의 Evaluate 메서드에있는 술어 때문에 일반 오버로드를 유지하려고합니다.

또한 확장 메서드를 사용하여이 작업을 수행 할 수 있다는 것을 알았지 만 아직 지원되지 않으므로 옵션이 아닙니다 .Net 2.0을 사용하고 유창한 API를 유지하려고합니다.

업데이트 :

비주얼 스튜디오에 타사 추가 기능을 포함 좋은 답변이왔다. 불행히도 저는 현재 개발중인 회사의 테이프 때문에 Visual Studio 용 애드온 도구를 설치하거나 구입할 수있는 위치에 없습니다. (나는 정치를 싫어!) 나는 코드를 모두 비주얼 스튜디오 2005 및 Visual Studio 업데이트 2008 년

에서 작동 유일한 옵션 찾고

:

이 비주얼 스튜디오 2008에서 작동합니다. 고맙습니다, Luke. Visual Studio 2005 만 남았습니다.

+1

도트 기호 뒤에 Ctrl + 스페이스 바를 치려고합니까? –

+0

예, 아니요. VS가 Intellisense의 메소드 목록을 채우는 데 사용하는 해석자가 다소 어리 석하다고 읽었습니다. 올바른 목록을 작성하는 데 도움이 될 수있는 코드가 있음을 기대했습니다. – Jason

+1

흠, intellisense는 VS2008SP1을 사용하여 예상대로 모든 것을 집어 들고있는 것 같습니다. – LukeH

답변

1

Intellisense는 일반 유형과 동일한 이름의 항목을보고 유형을 지정할 때까지 인텔리 센스 특성을 찾지 않아서라고 생각합니다. 예를 들어, "Require.That(string)"위에 마우스를 올려 놓으면 Visual Studio에서 IStringAssertion 대신 IAssertion으로보고합니다.

어쨌든 IStringAssertion의 "That"의 이름을 "ThatString"으로 바꿀 수 있습니다. 나는.

public static class Require 
{ 

    public static IStringAssertion ThatString(string value) 
    { 
     return null; 
    } 

    public static IAssertion<T> That<T>(T value) 
    { 
     return null; 
    } 

} 

public class RAR 
{ 
    public void TestMethod(StringComparer a, string b) 
    { 
     Require.That<StringComparer>(a).IsNotNull(); 
     Require.ThatString(b).IsNotNullOrEmpty(); 
    } 
} 
아마

적합하지 않습니다,하지만 난 다른 방법 이름을 사용로부터 떨어져 코드를 전면에 주위 어떤 방법이 생각하지 않습니다.

+0

그건 내가 두려워했던거야. 다른 메서드 이름은 옵션이지만 프레임 워크 디자인 지침에서는 메서드 이름에서 형식 이름을 유지해야한다고 말합니다. 사용자 관점에서 API의 복잡성에 다른 메소드 이름이 추가 될 것이라고 생각하십니까? 내 회사 환경의 다른 개발자를위한 것입니다. – Jason

+0

글쎄, 내 말을 복음으로 받아들이지 마라. 그 주위에 방법이 있을지 모르지만 나는 그것을 볼 수 없습니다. 복잡성을 참조하십시오, 나는 그것이 당신이 창조하고자하는 이들 중 얼마나 많은 것에 달려 있다고 생각합니다. String 및 int (즉, ThatString 및 ThatInt)의 값이 1 또는 2이면 큰 문제는 없습니다. 많은 유형을 사용하려는 경우 제네릭을 사용하지 않고 수동으로 수행 할 수 있습니다. 가능한 경우 항상 코딩 지침에 충실합니다. – GenericTypeTea

+0

최상의 옵션이 될 것 같습니다. ThatString, ThatDate, ThatComparable ... 메소드를 공장에 추가 할 것입니다. 이상적은 아니지만 작동 할 것입니다. – Jason

0

나는 Intellisense가 때로는 지적인 것이 아니며 때로는 어리 석다는 현실에 직면했다고 생각합니다.

+0

동의하지만이 코드는 나를위한 것이 아닙니다. 그것은 내 팀의 다른 개발자를 위해 개발중인 일부 프레임 워크 코드의 일부이며 Intellisense를 사용하지 않고도 사용할 수있는 방법을 알면 잃어 버릴 수 있습니다. 나는 그들이이 수업을 사용할 때마다 문서에서 그것을 찾아보기를 원하지 않는다. – Jason

0

Resharper을 설치해야합니다. VS 2008 인텔리 센스보다 훨씬 좋습니다.

+0

응답 해 주셔서 감사합니다. 그러나 회사에서 비용을 지불하지 않으므로이 옵션을 사용할 수 없습니다. – Jason

0

동일한 문제 - Intellisense가 그렇게 좋지 않습니다.

나는 비주얼은 X를 지원 사용하기 시작하고, X.에게

편집을 지원 비주얼로 전환 : 내가 ReSharper에서이 무료 버전을 가지고 있다고 생각합니다 (ReSharper에서의 제안에 답을 보았다). 어떤 경우 든, VAX는 귀하가 직접 구입할 가치가 있습니다.

+0

Resharper는 학업 또는 오픈 소스 사용을위한 무료 버전을 보유하고 있으며 그 중 어느 것도 자격이 없습니다. 나는 Resharper를 집에서 가지고 있고 그것을 좋아하지만 Resharper가 없거나 얻지 못할 개발자가 회사 환경에서 사용하기위한 것입니다. – Jason

관련 문제