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
:
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)
-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
var method = new Action<object>(MyClass.DoSomething<object>);
Beispiel 2: Auswahl einer -Methode, die zwei generische Typen und zwei Parameter akzeptiert: Where
var method = new Action<object, object>(MyClass.DoSomething<object, object>);
MethodInfo-Objekt abrufen
-Objekt benötigen, können Sie es nach dem Erstellen des Delegaten erhalten: MethodInfo
var methodInfo = method.Method.MakeGenericMethod(type1, type2);
var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>); var methodInfo = method.Method.MakeGenericMethod(modelType);
Objekt- und Parametertypen zu entkoppeln: MethodInfo
var methodInfo = method.Method.GetGenericMethodDefinition(); methodInfo.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection });
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!