2011-06-08 28 views
6

Estoy luchando con la idea de cómo construir un árbol de expresiones para más lambdas, como el que se muestra a continuación, y mucho menos algo que podría tener varias afirmaciones. Por ejemplo:Construyendo árboles de expresión

Func<double?, byte[]> GetBytes 
     = x => x.HasValue ? BitConverter.GetBytes(x.Value) : new byte[1] { 0xFF }; 

Agradecería cualquier idea.

Respuesta

5

Sugeriría leer a través del list of methods on the Expression class, todas sus opciones se enumeran allí, y el Expression Trees Programming Guide.

En cuanto a este caso particular:

/* build our parameters */ 
var pX = Expression.Parameter(typeof(double?)); 

/* build the body */ 
var body = Expression.Condition(
    /* condition */ 
    Expression.Property(pX, "HasValue"), 
    /* if-true */ 
    Expression.Call(typeof(BitConverter), 
        "GetBytes", 
        null, /* no generic type arguments */ 
        Expression.Member(pX, "Value")), 
    /* if-false */ 
    Expression.Constant(new byte[] { 0xFF }) 
); 

/* build the method */ 
var lambda = Expression.Lambda<Func<double?,byte[]>>(body, pX); 

Func<double?,byte[]> compiled = lambda.Compile(); 
+0

Gracias por la respuesta muy clara ... He estado leyendo sobre esto durante algún tiempo y parecía estar dando vueltas en círculos y siempre parecía faltar piezas ... –

+0

nota pequeña: Expression.Member (...) no existía en mi entorno, así que necesitaba cambiarlo a Expression.Property (...) –

+0

@ Craig: Está en lo cierto, también me refiero a la propiedad. – user7116

Cuestiones relacionadas