을 반환하는 매개 변수가 일반적인 인터페이스의 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()을 사용할 수 있었지만 형식을 알고 있어야했습니다. 즉 기본적으로 형식 인수를 직접 트래핑하여 형식 인수를 해결해야합니다. 계층 구조를 통해. 이 구체적인 예에서는 쉽습니다. 그러나 일반적인 해결책이 필요합니다. 확실히 나는 명백한 무엇인가 놓치고있다.
로 인터페이스를 선언하고 싶었 제거하거나'.MyMethod'을 IGenericBase에서 일반 메소드 스펙의 이름을 변경하십시오. 난 당신이 인터페이스와 메서드 (컴파일러는 이것에 대한 경고를 만듭니다) 모두에서 동일한 형식의 매개 변수 이름을 복제 의도로 생각하지 않습니다. –