2014-10-29 2 views
0
public static M MustNotEqual<M, T, R>(this IMustPassRule<M, T, R> mpr, R value) 
{ 
    return mpr.MustPassRule(new NotEqualRule<R>(value)); 
} 

public static M MustNotEqual<M, T, R>(this IMustPassRule<M, T, R> mpr, R value, IEqualityComparer<R> comparer) 
{ 
    return mpr.MustPassRule(new NotEqualRule<R>(value, comparer)); 
} 

예를 들어 반사 방식을 처음 사용하는 방법은 무엇입니까? 매개 변수가 제네릭 형식이 될하지 않을 경우확장 오버로드 된 일반 메소드를 반영하여 메소드를 얻는 방법은 무엇입니까?

+0

방금 ​​'typeof (ClassOfTheStaticMethods) .GetMethod ("MustNotEqual")'을 (를) 찾고 계십니까? – Dirk

+0

@Dirk : 그 이름의 두 가지 메서드가 존재한다는 점을 감안할 때 작성한 코드 행은 ['AmbiguousMatchException']을 트리거합니다 (http://msdn.microsoft.com/en-us/library/8zz808e6.aspx). –

+0

예, 메소드 이름에 신경을 쓰지는 않았지만 셀만 22가 대답을 게시하면 어떻게 될지를 보았습니다. – Dirk

답변

0

당신은 this overload of GetMethod를 사용하고 내가 LINQ를 사용하여 할 것이 경우 types.In 매개 변수와 일치하는 유형의 배열을 전달할 수 :

yourType.GetMethods(BindingFlags.Static | BindingFlags.Public) 
     .FirstOrDefault(m => m.Name == "MustNotEqual" && 
          m.GetParameters().Length == 2); 

는 당연히 당신이이을 향상시킬 수 있습니다 매개 변수 유형을 일치 시키십시오. 이것은 단지 예시 일뿐입니다. GetMethod이 옵션이 아닌 이유를 보려면 this question을 살펴보십시오.

0

클래스에 적용되는 확장 메소드를 찾는 것은 매우 까다 롭습니다. 확장 메서드를 호출하면 컴파일러는 메서드가있는 범위의 모든 형식을 ExtensionAttribute으로 봅니다. 이 확장은 컴파일러가 확장 메서드를 컴파일 할 때 자동으로 추가됩니다.

코드를 실행할 때 어떤 네임 스페이스가 범위 내에 있는지 개념이 없으므로 런타임에 문제를 해결하는 것이 어렵습니다. 클래스에 포함 된 것이 확장 메서드에 반드시 묶여있는 것은 아닙니다. 확장 메서드에 대한 특정 클래스를 검색하려면 쉽게 을 적절한 BindingFlags과 함께 사용하고 Extension 특성을 확인하십시오. 그러나 이것이 사실이 아니라면 매개 변수 조건과 일치하는 Extension 특성을 가진 정적 메서드가있는 공용 클래스를 검색하면서 현재로드 된 모든 어셈블리를 열거해야합니다.

관련 문제