Heim > Backend-Entwicklung > C++ > Wie kann ich mithilfe von Reflection in C# sicher die richtige generische Methodenüberladung auswählen?

Wie kann ich mithilfe von Reflection in C# sicher die richtige generische Methodenüberladung auswählen?

Linda Hamilton
Freigeben: 2025-01-11 13:27:42
Original
175 Leute haben es durchsucht

How Can I Safely Select the Correct Generic Method Overload Using Reflection in C#?

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

Bei der Verwendung generischer Methoden per Reflektion kann die Auswahl der richtigen Überladung schwierig sein, wenn mehrere generische Überladungen vorhanden sind. Dieses Problem tritt auf, wenn der Methodenname nicht eindeutig ist, z. B. bei der Methode „Where“ in der Klasse System.Linq.Queryable.

Anstatt sich auf Annahmen zu verlassen oder Methodennamen zu überprüfen, gibt es eine zur Kompilierungszeit sichere Möglichkeit, mithilfe von Delegaten die richtige generische Überladung auszuwählen.

Statische Methode

Betrachten Sie die folgende statische Methode mit mehreren generischen Überladungen:

<code class="language-csharp">public static void DoSomething<TModel>(TModel model)

public static void DoSomething<TViewModel, TModel>(TViewModel viewModel, TModel model)</code>
Nach dem Login kopieren

Um die erste Überladung (Void-Rückgabetyp, ein generischer Parameter) auszuwählen, erstellen Sie einen Operationsdelegaten, der seiner Signatur entspricht:

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

Verwenden Sie für die zweite Überladung (Rückgabetyp „void“, zwei generische Parameter) einen Aktionsdelegaten mit zwei Objektparametern:

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

Diese Methode wählt die richtige Überladung basierend auf der generischen Anzahl und der Argumentanzahl des Delegaten aus.

Um ein MethodInfo-Objekt zu erhalten, verwenden Sie die Method-Eigenschaft des Delegaten und rufen Sie MakeGenericMethod() auf:

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

Statische Erweiterungsmethode

Verwenden Sie für Beispielmethoden eine ähnliche Methodenauswahlmethode, rufen Sie jedoch GetGenericMethodDefinition() auf, bevor Sie den Typ an MakeGenericMethod() übergeben:

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

Methodeninfo und Parametertypen entkoppeln

Sie können ein generisches MethodInfo-Objekt erhalten, indem Sie GetGenericMethodDefinition() aufrufen und so die Auswahl der MethodInfo-Objekte von den Parametertypen entkoppeln:

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

Übergeben Sie dann die erforderlichen Typen an MakeGenericMethod(), wenn Sie die Methode aufrufen:

<code class="language-csharp">processCollection(methodInfo, type2);

...

protected void processCollection(MethodInfo method, Type type2)
{
    var type1 = typeof(MyDataClass);
    object output = method.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection });
}</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von Reflection in C# sicher 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