Convertir une expression > à l'expression >

c# expression-trees lambda

Question

J'ai un LambdaExpression qui est de type Expression<Func<T, string>> . La conception du code ne me permet pas actuellement de conserver T ce qui signifie que je suis obligé d'utiliser le DynamicInvoke plus DynamicInvoke au lieu de Invoke .

Étant donné que je connais le type de T je souhaite convertir l'expression de manière à ce qu'elle accepte un objet T , ce qui me permet d'utiliser Invoke . Comment?

Voici un bon début

class Program
{
    class MyClass
    {
        public string MyProperty => "Foo";
    }

    static LambdaExpression GetExpression(Expression<Func<MyClass, object>> expr)
    {
        return expr;
    }

    static void Main(string[] args)
    {
        var e1 = GetExpression(t => t.MyProperty);
        var e2 = Expression.Lambda<Func<object, object>>(e1, e1.Parameters);

        object myClass = new MyClass();
        string s1 = (string)e1.Compile().DynamicInvoke(myClass);
        object s2 = e2.Compile().Invoke(myClass);
    }
}

Réponse acceptée

La version non-expression ressemblerait à

Func<object, object> Convert<T>(Func<T, object> f) {
  return o => f((T)o);
}

C'est ce que vous devez également faire dans la version d'expression. Vous avez raison, Expression.Convert peut le faire.

Expression<Func<MyClass, object>> e1 = t => t.MyProperty;
var p = Expression.Parameter(typeof(object));
var e2 = Expression.Lambda<Func<object, object>>(
    Expression.Invoke(e1, Expression.Convert(p, typeof(MyClass))), p);

Remarque: comme @xanatos le note à juste titre, pour convertir par exemple Expression<Func<T, int>> en Expression<Func<object, object>> , bien que C # prenne en charge une conversion de boxe implicite d' int en object , les arbres d'expression ne le sont pas. Si cela est pertinent pour la question, un autre Expression.Convert est nécessaire.




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