Heim > Backend-Entwicklung > C++ > Wie wähle ich mithilfe von Reflection die richtige überladene generische Methode in .NET aus?

Wie wähle ich mithilfe von Reflection die richtige überladene generische Methode in .NET aus?

Barbara Streisand
Freigeben: 2025-01-11 13:31:42
Original
531 Leute haben es durchsucht

How to Select the Correct Overloaded Generic Method in .NET Using Reflection?

Verwenden Sie Reflexion, um die richtige generische Methode auszuwählen

Herausforderung: Überlastete generische Methoden identifizieren

Wenn in .NET mehrere generische Methodenüberladungen vorhanden sind, kann es schwierig sein, mithilfe der Reflektion die richtige Version auszuwählen. Beispielsweise hat eine statische Methode in der Klasse System.Linq.Queryable zwei Definitionen für die Methode Where:

<code class="language-c#">static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T, bool>> predicate)
static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T, bool>> predicate)</code>
Nach dem Login kopieren
Die

-Methode in der Reflexion ist für diese Aufgabe nicht ausreichend, da sie nicht zwischen diesen Überladungen unterscheiden kann. GetMethod

Lösung: Verwenden Sie parametrisierte Delegaten

Um die richtige generische Methode auszuwählen, können wir eine Technik anwenden, bei der parametrisierte Delegaten erstellt werden. Wir können die Methode zur Kompilierungszeit auswählen, indem wir einen

- oder Action-Delegaten erstellen, der der generischen Anzahl und Parameteranzahl der gewünschten Überladung entspricht: Func

Beispiel 1: Wählen Sie eine -Methode aus, die einen generischen Typ und einen einzelnen Parameter akzeptiert: Where

<code class="language-c#">var method = new Action<object>(MyClass.DoSomething<object>);</code>
Nach dem Login kopieren

Beispiel 2: Auswahl einer -Methode, die zwei generische Typen und zwei Parameter akzeptiert: Where

<code class="language-c#">var method = new Action<object, object>(MyClass.DoSomething<object, object>);</code>
Nach dem Login kopieren
Dieser Ansatz ermöglicht es uns, die Methoden zu erhalten, die wir benötigen, ohne uns auf riskante String- oder Laufzeitsuchen verlassen zu müssen.

MethodInfo-Objekt abrufen

Wenn Sie das

-Objekt benötigen, können Sie es nach dem Erstellen des Delegaten erhalten: MethodInfo

<code class="language-c#">var methodInfo = method.Method.MakeGenericMethod(type1, type2);</code>
Nach dem Login kopieren
Statische Erweiterungsmethode

Statische Erweiterungsmethoden erfordern einen etwas komplexeren Ansatz, es gelten jedoch die gleichen Prinzipien:

<code class="language-c#">var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>);

var methodInfo = method.Method.MakeGenericMethod(modelType);</code>
Nach dem Login kopieren
Entkopplung von MethodInfo und Parametertypen

Manchmal kann es notwendig sein,

Objekt- und Parametertypen zu entkoppeln: MethodInfo

<code class="language-c#">var methodInfo = method.Method.GetGenericMethodDefinition();

methodInfo.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection });</code>
Nach dem Login kopieren
Mit dieser Technik können Sie komplexe Vorgänge ausführen, z. B. Instanzmethoden aus einer Klasse auswählen und sie zur Verwendung für verschiedene Typen verfügbar machen.

Fazit

Durch die Verwendung parametrisierter Delegaten können wir die Einschränkungen von

umgehen und zur Kompilierungszeit die richtige generische Methode auswählen. Dieser Ansatz gewährleistet die Typsicherheit und vermeidet unnötige dynamische Suchvorgänge. GetMethod

Das obige ist der detaillierte Inhalt vonWie wähle ich mithilfe von Reflection die richtige überladene generische Methode in .NET aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage