"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C#에서 런타임 결정 유형 인수로 일반 메소드를 동적으로 호출하려면 어떻게해야합니까?

C#에서 런타임 결정 유형 인수로 일반 메소드를 동적으로 호출하려면 어떻게해야합니까?

2025-03-22에 게시되었습니다
검색:877

How Can I Dynamically Invoke Generic Methods with Runtime-Determined Type Arguments in C#?

솔루션

유형 인수와 함께 일반적인 방법을 동적으로 호출하면 다음과 같이 반영을 사용할 수 있습니다.

  1. 일반 방법을 얻을 수 있습니다. 메소드 정의.
  2. 일반 메소드 인스턴스를 생성
  3. : 일반 메소드 정의에서 MakeGenericMethod 메서드를 호출하여 원하는 유형 인수에 대한 특정 메소드 인스턴스를 생성합니다. 인수.
  4. 예제 코드
  5. 시스템을 사용합니다. System.linq 사용; 시스템 사용; 반사; 공개 수업 테스트 클래스 { 공개 정적 무효 CallGeneric () { Console.WriteLine ($ "일반 유형 : {typeof (t)}"); } 공개 정적 무효 메인 () { var Assembly = assembly.getexecutingAssembly (); var interfaces = assembly.getTypes () .where (t => t.namespace == "mynamespace.interfaces"); var genericmethod = typeof (testClass) .getMethod ( "CallGeneric"); foreach (인터페이스의 var interfacetype) { var genericmethodinstance = genericMethod.MakeGenericMethod (InterfaceType); genericmethodinstance.invoke (null, null); // 대상이나 인수가 필요하지 않습니다 } } }
  6. 이 예에서 :

CallGeneric 메소드는 일반적인 유형 인수를 인쇄하는 일반적인 메소드로 정의됩니다. 각 인터페이스 유형의 일반적인 메소드 인스턴스.
using System;
using System.Linq;
using System.Reflection;

public class TestClass
{
    public static void CallGeneric()
    {
        Console.WriteLine($"Generic type: {typeof(T)}");
    }

    public static void Main()
    {
        var assembly = Assembly.GetExecutingAssembly();

        var interfaces = assembly.GetTypes()
            .Where(t => t.Namespace == "MyNamespace.Interfaces");

        var genericMethod = typeof(TestClass).GetMethod("CallGeneric");

        foreach (var interfaceType in interfaces)
        {
            var genericMethodInstance = genericMethod.MakeGenericMethod(interfaceType);
            genericMethodInstance.Invoke(null, null); // No target or arguments needed
        }
    }
}
매개 변수가없는 정적 메소드이므로 대상이나 인수없이 일반 메소드 인스턴스를 호출합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3