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>
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>
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>
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>
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>
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>
Ü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>
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!