Trasmissione del risultato Espressione.Proprietà

c# expression-trees reflection

Domanda

Come posso creare un cast durante la creazione dinamica di un albero di Expression ?

Il problema è che ho una proprietà di tipo string :

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

E voglio generare genericamente un'espressione lambda fortemente tipizzata che rappresenta un delegato che restituisce un object invece di una string ( Expression<Func<T, object>> ).

In questo momento sto facendo questo:

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;
}

Ma lancia un'eccezione nell'ultima riga (non posso lanciare Expression<Func<Test, string>> in Expression<Func<Test, object>> ).

Come lancio il corpo dell'espressione ( MemberExpression parte MemberExpression debba essere inserita in un object )?

Risposta accettata

Usa 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;
}


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché