Die Auswahl einer geeigneten generischen Methode durch Reflexion kann eine Herausforderung sein, insbesondere wenn es mehrere generische Überladungen der Methode gibt. In diesem Artikel wird eine kompilierungssichere und effiziente Möglichkeit untersucht, die richtige generische Methode auszuwählen, ohne auf Zeichenfolgen oder Laufzeitsuchen angewiesen zu sein.
Durch die Verwendung eines Lambda-Ausdrucks oder Delegaten mit einer MethodInfo.MakeGenericMethod
-Methode können bestimmte generische Überladungen zur Kompilierungszeit ausgewählt werden. Wenn Sie beispielsweise über die folgende generische Methode verfügen:
<code>public static void DoSomething<TModel>(TModel model)</code>
Sie können einen Delegaten erstellen, der seiner generischen Anzahl und Argumentanzahl entspricht:
<code>var method = new Action<object>(MyClass.DoSomething<object>);</code>
Durch Ersetzen eines generischen Typs durch object
können Sie die richtige Überladung auswählen, ohne auf Laufzeit-Pipes oder riskante String-Manipulationen zurückgreifen zu müssen.
Für statische Methoden (wie die in der Klasse System.Linq.Queryable
) können Sie einen ähnlichen Ansatz verwenden. Um beispielsweise eine IQueryable<TModel>
-Methode auszuwählen, die Expression<Func<TModel, bool>>
und Where
akzeptiert, würden Sie Folgendes tun:
<code>var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>);</code>
Um eine Instanzmethode auszuwählen, können Sie einem ähnlichen Muster folgen, aber MakeGenericMethod
verwenden, um das generische GetGenericMethodDefinition
abzurufen, bevor Sie MethodInfo
aufrufen.
MethodInfo
und ParametertypenMit GetGenericMethodDefinition
können Sie die Auswahl von MethodInfo
von der Zuweisung des generischen Typs entkoppeln und MethodInfo
an eine andere Methode übergeben, die den zu instanziierenden Typ kennt und die Methode mit diesem Typ aufruft.
Um diesen Ansatz zu veranschaulichen, betrachten Sie eine Klasse mit mehreren Überladungen einer generischen Methode CopyList
. Der folgende Code zeigt, wie Sie mit der oben genannten Technik die richtige Überladung auswählen:
<code>var listTo = ReflectionHelper.GetIEnumerableType(fromValue.GetType()); var fn = new Func<IEnumerable<object>, Func<PropertyInfo, bool>, Dictionary<Type, Type>, IEnumerable<object>>(ModelTransform.CopyList<object>); var copyListMethod = fn.GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod(listTo); copyListMethod.Invoke(null, new object[] { fromValue, whereProps, typeMap });</code>
Durch die Nutzung der Leistungsfähigkeit von Lambda-Ausdrücken und Delegaten können Sie elegant über Reflektion die richtige generische Methode auswählen, um die Sicherheit bei der Kompilierung zu gewährleisten und die Fallstricke stringbasierter oder Laufzeitsuchen zu vermeiden.
Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von Reflection sicher die richtige generische Methodenüberladung auswählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!