Reflection permet aux développeurs d'accéder aux informations de type et d'appeler dynamiquement des méthodes. Cependant, faire la distinction entre les surcharges peut s’avérer difficile lors du choix d’une méthode générique. Par exemple, la classe System.Linq.Queryable
contient des définitions pour plusieurs méthodes Where
, ce qui rend difficile le choix de la version requise.
Pour résoudre ce problème, vous pouvez utiliser une solution sécurisée pour la compilation :
Construisez un délégué ou une expression avec le nombre et le type corrects de paramètres génériques et de méthode qui correspondent à la surcharge cible. Par exemple :
<code class="language-csharp">var method = new Action<object>(MyClass.DoSomething<object>);</code>
Extrayez MethodInfo
d'un délégué ou d'une expression et utilisez GetGenericMethodDefinition
pour obtenir la définition de la méthode générique.
<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition();</code>
Transmettez les paramètres de type générique réels à MakeGenericMethod
pour instancier une méthode générique spécifique.
<code class="language-csharp">var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
Pour Queryable.Where
méthode avec surcharge :
<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>
Le code suivant montre comment sélectionner la première version :
<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>
Pour une plus grande flexibilité, vous pouvez obtenir MethodInfo
séparément et spécifier les paramètres de type générique ultérieurement. Ceci est utile lorsque le type est inconnu lors de la récupération de la méthode.
<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition(); var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
En suivant ces étapes, les développeurs peuvent sélectionner la méthode générique correcte par réflexion de manière flexible et sécurisée pour la compilation, même s'il existe plusieurs surcharges.
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!