Heim > Backend-Entwicklung > C++ > Wie kann man mithilfe von Reflection zuverlässig die richtige generische Methodenüberladung auswählen?

Wie kann man mithilfe von Reflection zuverlässig die richtige generische Methodenüberladung auswählen?

Barbara Streisand
Freigeben: 2025-01-11 13:42:43
Original
247 Leute haben es durchsucht

How to Reliably Select the Correct Generic Method Overload Using Reflection?

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

Hintergrund

Reflection ermöglicht Entwicklern den Zugriff auf Typinformationen und den dynamischen Aufruf von Methoden. Bei der Auswahl einer generischen Methode kann es jedoch schwierig sein, zwischen Überladungen zu unterscheiden. Beispielsweise enthält die Klasse System.Linq.Queryable Definitionen für mehrere Where-Methoden, was die Auswahl der erforderlichen Version erschwert.

Wählen Sie die richtige Methode basierend auf dem Parametertyp

Um dieses Problem zu lösen, können Sie eine kompilierungssichere Lösung verwenden:

1. Erstellen Sie einen Delegaten oder Ausdruck, der der gewünschten Überladung entspricht

Konstruieren Sie einen Delegaten oder Ausdruck mit der richtigen Anzahl und dem richtigen Typ von generischen Parametern und Methodenparametern, die der Zielüberladung entsprechen. Zum Beispiel:

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

2. Holen Sie sich generische MethodInfo

Extrahieren Sie MethodInfo aus einem Delegaten oder Ausdruck und verwenden Sie GetGenericMethodDefinition, um die generische Methodendefinition abzurufen.

<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition();</code>
Nach dem Login kopieren

3. Geben Sie generische Typparameter an

Übergeben Sie tatsächliche generische Typparameter an MakeGenericMethod, um eine bestimmte generische Methode zu instanziieren.

<code class="language-csharp">var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
Nach dem Login kopieren

Beispiel für die Verwendung einer Queryable.Where-Überladung

Für Queryable.Where Methode mit Überladung:

<code class="language-csharp">public static IQueryable<TModel> Where<TModel>(this IQueryable<TModel>, Expression<Func<TModel, bool>>)

public static IQueryable<TModel> Where<TModel>(this IQueryable<TModel>, Expression<Func<TModel, int, bool>>)</code>
Nach dem Login kopieren

Der folgende Code zeigt, wie die erste Version ausgewählt wird:

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

var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(modelType);</code>
Nach dem Login kopieren

Entkopplung von MethodInfo und Parametertypen

Für mehr Flexibilität können Sie MethodInfo separat erwerben und die generischen Typparameter später angeben. Dies ist nützlich, wenn der Typ beim Abrufen der Methode unbekannt ist.

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

var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
Nach dem Login kopieren

Durch Befolgen dieser Schritte können Entwickler die richtige generische Methode durch Reflektion auf kompilierungssichere und flexible Weise auswählen, selbst wenn mehrere Überladungen vorhanden sind.

Das obige ist der detaillierte Inhalt vonWie kann man mithilfe von Reflection zuverlässig die richtige generische Methodenüberladung auswählen?. 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