런타임에 결정된 유형으로 일반 메소드 호출
이 문제는 컴파일 타임에 알 수 없는 유형 매개변수를 사용하여 일반 메소드를 호출하려고 할 때 발생합니다. . 일반적인 메서드 호출은 컴파일러가 수행하는 유형 안전성 검사에 의존하지만 유형이 런타임에만 사용 가능한 경우 대체 접근 방식이 필요합니다.
반사 기반 솔루션
제공된 코드 예제의 맥락에서:
public void Method<T>() where T : class {} public void AnotherMethod() { ... foreach (var interface in interfaces) { Method<interface>(); // Compile error! } }
컴파일 시간 유형을 우회하려면 확인:
Type.GetMethod를 사용하여 개방형 일반 메서드를 검색합니다.:
MethodInfo method = typeof(Test).GetMethod("Method");
일반 메소드 MakeGenericMethod:
MethodInfo genericMethod = method.MakeGenericMethod(interface);
Invoke를 사용하여 메서드 호출:
genericMethod.Invoke(null, null); // No target or arguments in this case
완벽한 예
프로세스를 명확히 하려면 수정된 다음 코드 샘플을 고려하세요.
using System; using System.Linq; using System.Reflection; namespace Sample { interface IFoo { } interface IBar { } class Program { public static void CallMe<T>() { Console.WriteLine("Type of T: {0}", typeof(T)); } static void Main() { var types = typeof(Program).Assembly.GetTypes().Where(t => t.Namespace == "Sample"); var methodInfo = typeof(Program).GetMethod("CallMe"); foreach (var type in types) { var genericMethodInfo = methodInfo.MakeGenericMethod(type); genericMethodInfo.Invoke(null, null); } } } }
이 예에서는 일반 CallMe 메서드가 Sample 네임스페이스에 있는 유형을 기반으로 동적으로 호출됩니다. .
위 내용은 런타임에 결정된 유형으로 일반 메서드를 호출하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!