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:
Rufen Sie die offene generische Methode mit Type.GetMethod ab:
MethodInfo method = typeof(Test).GetMethod("Method");
Machen Sie die Methode generisch mit MakeGenericMethod:
MethodInfo genericMethod = method.MakeGenericMethod(interface);
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!