Heim >Backend-Entwicklung >C++ >Wie kann ich generische Methoden mit laufzeitbestimmten Typen aufrufen?

Wie kann ich generische Methoden mit laufzeitbestimmten Typen aufrufen?

Linda Hamilton
Linda HamiltonOriginal
2024-12-30 14:53:161019Durchsuche

How Can I Call Generic Methods with Runtime-Determined Types?

Aufrufen generischer Methoden mit zur Laufzeit bestimmten Typen

Dieses Problem tritt auf, wenn versucht wird, eine generische Methode mit einem zur Kompilierungszeit unbekannten Typparameter aufzurufen . Gewöhnliche Methodenaufrufe basieren auf Typsicherheitsprüfungen, die vom Compiler durchgeführt werden. Wenn der Typ jedoch nur zur Laufzeit verfügbar ist, sind alternative Ansätze erforderlich.

Reflexionsbasierte Lösung

Im Kontext des bereitgestellten Codebeispiels:

public void Method<T>() where T : class {}
public void AnotherMethod()
{
    ...
    foreach (var interface in interfaces)
    {
        Method<interface>(); // Compile error!
    }
}

Um den Typ zur Kompilierungszeit zu umgehen Überprüfung:

  1. Rufen Sie die offene generische Methode mit Type.GetMethod ab:

    MethodInfo method = typeof(Test).GetMethod("Method");
  2. Machen Sie die Methode generisch mit MakeGenericMethod:

    MethodInfo genericMethod = method.MakeGenericMethod(interface);
  3. Rufen Sie die Methode mit Invoke auf:

    genericMethod.Invoke(null, null); // No target or arguments in this case

Vollständiges Beispiel

Um den Prozess zu verdeutlichen, berücksichtigen Sie dieses überarbeitete Codebeispiel:

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);
            }
        }
    }
}

In diesem Beispiel wird die generische CallMe-Methode dynamisch basierend auf den im Beispiel-Namespace gefundenen Typen aufgerufen.

Das obige ist der detaillierte Inhalt vonWie kann ich generische Methoden mit laufzeitbestimmten Typen aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn