Próximo post
Anterior post
Implementé algunos ejemplos simples usando DLR. Mostré cómo crear y evaluar expresiones. Cada Expression tiene algunas propiedades y métodos expuestos. Algunas de las más importantes:
Noten que cada objeto Expression tiene un NodeType, y Type separado. Exploremos esos valores:
BinaryExpression expr = Expression.Add(Expression.Constant(10), Expression.Constant(20)); Console.WriteLine(expr.GetType().FullName); Console.WriteLine(expr.Type); Console.WriteLine(expr.Left.Type); Console.WriteLine(expr.Right.Type); Console.WriteLine(expr.NodeType); Console.WriteLine(expr.Left.NodeType); Console.WriteLine(expr.Right.NodeType);Veamos Expression.Add. Es una expresión binaria. Cada una de esas expresiones tiene dos ramas:
Obtengo la salida:
Noten que el .GetType() (el tipo .NET) de la Expression creada, es SimpleBinaryExpression: no es sólo un objeto Expression. Tampoco hay un AddExpression como clase en DLR. El expr.NodeType indica que la expresión creada es un Add. Los creadores de DLR decidieron no tener una clase dedicada para los Expression.Add.
Un BinaryExpression tiene Type: System.Int32, un entero de 32 bits. Este es el tipo que indica qué clase de valor retornará esta expresión. Se deriva de la acción de la expresión binaria (sumar) y los tipos de sus ramas izquierda y derecha.
En C#, podemos combinar expresiones binarias:
// double result = (3d + 2d) / 7d; // Console.WriteLine(result); BinaryExpression expr2 = Expression.Divide( Expression.Add(Expression.Constant(3d), Expression.Constant(2d)), Expression.Constant(7d) ); Func<double> binaryDelegate = Expression.Lambda<Func<double>>(expr2).Compile(); Console.WriteLine(binaryDelegate.Invoke());Principal fuente consultada para este ejemplo: “Pro DLR in .NET 4” de Chaur Wu. El código de esta serie de post se mantiene en http://code.google.com/p/ajcodekatas/ en el directorio trunk/Dlr.
Próximos pasos: expresiones IfThenElse, expresiones switch, qué es un visitor, y qué es Reduce.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com