2017-02-13 3 views
4

Ich versuche Ausdruck e dynamische FunX von StringC# Expression Lambda zu Func <T> aus string

Expression<Func<CustomerDto, object>> expr = (src) => src.Customer.Id; 
Func<CustomerDto, object> delg = expr.Compile(); 
var id = delg.Invoke(customerListDtos[0]); 

und geben die ID (s. 123)

ich also nun umzusetzen versuchen Ausdruck zu erstellen, die von Zeichenfolge

public Expression<Func<T, object>> GetLambda<T>(string property) 
    { 

     var param = Expression.Parameter(typeof(T), "p"); 
     Expression body = param; 
     foreach (var member in property.Split('.')) 
     { 
      body = Expression.PropertyOrField(body, member); 
     } 
     //return Expression.Lambda(body, param); 

     //Expression parent = Expression.Property(param, property); 
     Expression parent = Expression.Lambda(body, param); 
     //if (!parent.Type.IsValueType) 
     //{ 
     // return Expression.Lambda<Func<T, object>>(parent, param); 
     //} 
     var convert = Expression.Convert(parent, typeof(object)); 
     return Expression.Lambda<Func<T, object>>(convert, param); 
    } 

Also, wenn ich das Ergebnis von GetLambda nennen, ist der Ausgang nicht 123, sondern ist

var data = GetLambda<CustomerDto>("Customer.Id"); 
Func<CustomerDto, object> g = data.Compile(); 
var id = g(customerListDtos[0]); 

das Ergebnis ist

{Method = {Int64 lambda_method(System.Runtime.CompilerServices.Closure, ef.Customer.CustomerDto)}} 
+3

fehlt Aufruf? – A3006

Antwort

5

Du Expression.Labmda zweimal anrufen, im Wesentlichen eine func in eine andere Verpackung. Versuchen Sie dies stattdessen:

public static Expression<Func<T, object>> GetLambda<T>(string property) { 
    var param = Expression.Parameter(typeof(T), "p"); 
    Expression body = param; 
    foreach (var member in property.Split('.')) { 
     body = Expression.PropertyOrField(body, member); 
    } 
    var convert = Expression.Convert(body, typeof(object)); 
    return (Expression<Func<T, object>>) Expression.Lambda(convert, param); 
} 
+0

es funktioniert gut! Danke – andmattia

Verwandte Themen