Création d'un arbre d'expression pour concaténer deux objets

.net c# expression-trees lambda

Question

J'apprends juste à propos d' Expression et de leurs arbres d'expression à utiliser avec IronPython (mais ce n'est pas pertinent pour le moment).

Ce que j'essaie de faire, c'est de créer un arbre d'expression du type lambda suivant:

Func<T, int, string> func = (s,t) => s + t;

Ma fonction actuelle est la suivante:

public static Expression<Func<T, int, string>> StringConcatSelector<T>()
{
    var parameterParam = Expression.Parameter(typeof(T), "x");
    var paramToString = typeof(T).GetMethods().FirstOrDefault(s=>s.Name=="ToString");
    var parameter = Expression.Call(parameterParam, paramToString);


    var intParameterParam = Expression.Parameter(typeof(int), "s");
    var intParameterToString = typeof(int).GetMethods().FirstOrDefault(s => s.Name == "ToString");
    var intParameter = Expression.Call(intParameterParam, intParameterToString);

    var stringConcat = typeof(string).GetMethods().FirstOrDefault(s => s.Name == "Concat");

    var result = Expression.Call(stringConcat, parameter, intParameter);

    return Expression.Lambda<Func<T, int, string>>
                         (result, parameterParam, intParameterParam);
}

l' Expression.Call de String.Concat ne fonctionnera pas de cette façon, en raison d'un nombre de paramètres non valide. Je pense donc avoir besoin de quelque chose comme:

  • créer une List<string> -variable-expression
  • ajouter les deux valeurs à la liste
  • utilisez String.Concat avec l'expression de liste.

Ai-je raison?

Si oui, comment puis-je créer une variable de liste (ou un tableau), ajoutez les deux valeurs pour le prendre en paramètre pour mon String.Concat ?

Réponse acceptée

String.Concat méthode String.Concat a 11 (!) Surcharges et vous en prenez une au hasard.

Le plus approprié pour votre cas est

public static String Concat(String str0, String str1)

que vous pouvez obtenir en utilisant la surcharge Type.GetMethod suivante

public MethodInfo GetMethod(string name, Type[] types)

où le tableau types représente le type des arguments de la méthode:

var stringConcat = typeof(string).GetMethod("Concat",
    new[] { typeof(string), typeof(string) });


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