Appelez la méthode statique dans expression.call avec des arguments

.net c# delegates expression-trees lambda

Question

J'ai étendu la classe string pour la méthode Contains . J'essaie de l'appeler dans Expression.Call , mais comment passer l'argument correctement?

Code: String contient la méthode:

public static class StringExts
{
    public static bool NewContains(this string source, string ValToCheck, StringComparison StrComp)
    {
        return source.IndexOf(ValToCheck, StrComp) >= 0;
    }
}

Dans l'expression appelant en tant que:

public static class StringExts
{
    public static bool NewContains(this string source, string ValToCheck, StringComparison StrComp)
    {
        return source.IndexOf(ValToCheck, StrComp) >= 0;
    }
}

Erreur:

Une exception non gérée du type 'System.ArgumentException' s'est produite dans System.Core.dll.Informations supplémentaires: La méthode statique requiert une instance null, la méthode non statique requiert une instance non-nulle

Comment appeler le paramètre dans miContain pour les méthodes Call() ?

J'ai mis à jour le code.

Réponse acceptée

Vous ne spécifiez pas tous les paramètres. Si vous créez des expressions pour tous, cela fonctionne:

ParameterExpression source = Expression.Parameter(typeof(string));
string ValToCheck = "A";
StringComparison StrComp = StringComparison.CurrentCultureIgnoreCase;

MethodInfo miContain = typeof(StringExts).GetMethod("NewContains", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
var bEXP = Expression.Call(miContain, source, Expression.Constant(ValToCheck), Expression.Constant(StrComp));

var lambda = Expression.Lambda<Func<string, bool>>(bEXP, source);

bool b = lambda.Compile().Invoke("a");

Réponse populaire

Vous n'avez pas spécifié suffisamment d'arguments (2 vs 3). NewContains a trois arguments.

De plus, comme cette méthode n'est pas une méthode d'instance, vous ne pouvez pas définir le paramètre this. Cette surcharge a l'air mieux.

Vous auriez probablement dû examiner la liste de surcharge . C'est ainsi que j'ai trouvé la bonne réponse à cette question sans le savoir moi-même à l'avance.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi