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>
-Methode in der Reflexion ist für diese Aufgabe nicht ausreichend, da sie nicht zwischen diesen Überladungen unterscheiden kann. GetMethod
- 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>
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>
MethodInfo-Objekt abrufen
-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>
<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>
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>
Fazit
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!