Dans .NET, lorsqu'il existe plusieurs surcharges de méthodes génériques, il peut être difficile d'essayer d'utiliser la réflexion pour sélectionner la bonne version. Par exemple, une méthode statique de la classe System.Linq.Queryable
a deux définitions pour la méthode 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)
en réflexion n'est pas suffisante pour cette tâche car elle ne permet pas de différencier ces surcharges. GetMethod
ou Action
qui correspond au nombre générique et au nombre de paramètres de la surcharge souhaitée : Func
Exemple 1 : Sélectionnez une méthode qui prend un type générique et un seul paramètre : Where
var method = new Action<object>(MyClass.DoSomething<object>);
Exemple 2 : Sélection d'une méthode qui prend deux types génériques et deux paramètres : Where
var method = new Action<object, object>(MyClass.DoSomething<object, object>);
Obtenir l'objet MethodInfo
, vous pouvez l'obtenir après avoir créé le délégué : 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);
les types d'objet et de paramètre : MethodInfo
var methodInfo = method.Method.GetGenericMethodDefinition(); methodInfo.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection });
Conclusion
et sélectionner la méthode générique correcte au moment de la compilation. Cette approche garantit la sécurité des types et évite les recherches dynamiques inutiles. GetMethod
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!