Casting des Expression.Property-Ergebnisses

c# expression-trees reflection

Frage

Wie erstelle ich eine Umwandlung, wenn ich eine Expression dynamisch erstelle?

Das Problem ist, ich habe eine Eigenschaft vom Typ string :

public class Test
{
    public string Id { get; set; }
}

Und ich möchte generisch einen stark typisierten Lambda-Ausdruck erzeugen, der einen Delegaten repräsentiert, der ein object anstelle einer string Expression<Func<T, object>> ( Expression<Func<T, object>> ).

Gerade jetzt mache ich das:

private static Expression<Func<T, object>> CreateIdQuery()
{
    Type type = typeof(T);
    PropertyInfo idProperty = type.GetProperty("Id");
    ParameterExpression lambdaParam = Expression.Parameter(type, "x");
    MemberExpression body = Expression.Property(lambdaParam, idProperty);
    LambdaExpression expr = Expression.Lambda(body, lambdaParam);
    return (Expression<Func<T, object>>)expr;
}

Aber es wirft eine Ausnahme in der letzten Zeile (Ich kann Expression<Func<Test, string>> auf Expression<Func<Test, object>> ) Expression<Func<Test, object>> .

Wie MemberExpression ich den Body des Ausdrucks dar (ich MemberExpression an, dass der MemberExpression Teil in ein object )?

Akzeptierte Antwort

Verwenden Sie Expression.Convert(body, typeof(object)) .

private static Expression<Func<T, object>> CreateIdQuery()
{
    Type type = typeof(T);
    PropertyInfo idProperty = type.GetProperty("Id");
    ParameterExpression lambdaParam = Expression.Parameter(type, "x");
    MemberExpression body = Expression.Property(lambdaParam, idProperty);
    UnaryExpression converted = Expression.Convert(body, typeof(object));
    LambdaExpression expr = Expression.Lambda(converted, lambdaParam);
    return (Expression<Func<T, object>>)expr;
}


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum