2014-03-26 3 views
4

을 반환하는 매개 변수가 일반적인 인터페이스의 getMethods는()입니다 :왜 이러한 인터페이스 감안할 때 비 매개 변수가 MethodInfo

public interface IGenericBase<T> 
{ 
    T MyMethod<T>(T arg1); 
} 

public interface IGenericDescendant : IGenericBase<int> 
{ 
} 

IGenericDescendant의 유형을 사용하여, 나는()의 getInterfaces를 통해 인터페이스 세트를 가져옵니다. 예상대로이 메서드는 T가 Int32로 확인 된 IGenericBase`1을 "해결 된"(매개 변수화 된) 형식으로 반환합니다. 그런 다음 인터페이스 형식에서 GetMethods를 호출하여 MyMethod와 비슷하게 해결 된 버전을 얻으 려하지만 대신 T를 사용하여 일반 버전을 확인할 수없는 형식 인수로 가져옵니다. 마이크로 소프트의 documentation에 따르면

var type = typeof(IGenericDescendant);  
foreach (var super in type.GetInterfaces()) 
{ 
    foreach (var member in super.GetMethods()) 
    { 
     yield return member; // Get MyMethod<T> not MyMethod<Int32> 
    } 
} 

,이 getMethods는 대한 올바른 동작()되지 않습니다 :

만약 현재 T : System.Type이 생성 된 제네릭 타입, 이 방법은 MethodInfo가 개체 반환을 나타냅니다 적절한 형식 인수로 대체 된 형식 매개 변수

불행하게도

, 그 일반 인터페이스를 해결 유형에 올 때 단지 그런 것 같지 않습니다.

해결 방법으로, 나는 형식 인수를 해결하기 위해 MakeGenericType()을 사용할 수 있었지만 형식을 알고 있어야했습니다. 즉 기본적으로 형식 인수를 직접 트래핑하여 형식 인수를 해결해야합니다. 계층 구조를 통해. 이 구체적인 예에서는 쉽습니다. 그러나 일반적인 해결책이 필요합니다. 확실히 나는 명백한 무엇인가 놓치고있다.

+1

로 인터페이스를 선언하고 싶었 제거하거나'.MyMethod' 을 IGenericBase에서 일반 메소드 스펙의 이름을 변경하십시오. 난 당신이 인터페이스와 메서드 (컴파일러는 이것에 대한 경고를 만듭니다) 모두에서 동일한 형식의 매개 변수 이름을 복제 의도로 생각하지 않습니다. –

답변

3

MyMethod은 제네릭 인터페이스에서 선언 된 제네릭 메서드입니다. 제네릭 유형에 대한 매개 변수를 지정하면 여전히 일반적인 방법으로 남아 있습니다. 예를 들어 :

IGenericDescendant x = new SomeImplementation(); 
x.MyMethod<string>("abc"); // method is still generic 

IGenericBase<int> y = new SomeOtherImplementation(); 
y.MyMethod<string>("abc"); // still can do that 

당신은 아마

public interface IGenericBase<T> 
{ 
    T MyMethod(T arg1); 
} 
+0

형식 이름'T'가 재정의되었다는 컴파일러 경고가 무시 될 가능성이 있습니다. 메소드가'MyMethod '으로 선언 되었다면, 예상대로 작동했을 것이다. –

+0

와우, 좋은 캐치, 분명 했어야했다. 감사! 그리고 스티브, 경고에 대해 당신 말이 맞아. – N8allan

관련 문제