2011-06-27 7 views
11

Estoy usando Expression para crear un poco de código generado dinámicamente. Mi solución funciona, a excepción de una característica: quiero hacer una conversión de tipo revisada, donde se lanza TypeCastException si falla el lanzamiento.revisado tipo fundido en un árbol de expresiones?

he encontrado Expression.TypeAs(), que hace la conversión de tipos, pero devuelve un valor nulo, en lugar de tirar, cuando la conversión falla.

¿Hay una manera simple de hacer un tipo de yeso marcado en Expression? ¿O debo verificar nulo y lanzar la excepción yo mismo?

Esto es lo que tengo: -

ParameterExpression typedAttribute = Expression.Variable(attributeType, "typedAttribute"); 
ParameterExpression typedValue = Expression.Variable(valueType, "typedValue"); 

BlockExpression methodBlock = Expression.Block(new[] { typedAttribute, typedValue }, new Expression[] 
    { 
     Expression.Assign(typedAttribute, Expression.TypeAs(attribute, attributeType)), 
     Expression.Assign(typedValue, Expression.TypeAs(value, valueType)), 
     Expression.Call(visitor, methodInfo, typedAttribute, typedValue), 
     Expression.Assign(visited, Expression.Constant(true)), 
    }); 

Respuesta

12

Expression.Convert debe actuar como un molde aquí.

+1

Gracias, eso funciona. De hecho, recuerdo haber probado Expression.Convert() anteriormente, pero creo que tuve otro error en mi código en ese momento, lo que me impidió ver que era la solución correcta. De todos modos, genial tener una respuesta definitiva tan rápido! – PeteAC

+0

¿hay un lanzamiento más rápido? Estoy creando setters/getters compilados pero el boxing unboxing to object ralentiza todo ... –

+1

@Demetris luego: no use datos en caja ... Es difícil decir más que eso sin contexto –

Cuestiones relacionadas