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.
Um dieses Problem zu lösen, können Sie eine kompilierungssichere Lösung verwenden:
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>
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>
Ü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>
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>
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>
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>
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!