Accediendo a Expression.DebugView desde el código

c# expression-trees

Pregunta

Estoy creando manualmente un árbol de expresiones como esta.

var innerAddition = Expression.Add(Expression.Constant(5), Expression.Constant(9));
var mult = Expression.Multiply(innerAddition, Expression.Constant(2));
var top = Expression.Add(Expression.Constant(3), mult);

Cuando veo DebugView en modo de depuración, veo 3 + (5 + 9) * 2, que es lo que me gustaría generar desde mi programa. Entiendo que esto es usar el visualizador de árbol de expresiones. ¿Hay alguna forma de usar esto desde mi código? ¡Gracias!

Respuesta aceptada

Las clases que implementan las características de la vista de depuración son intencionalmente internal por lo que no puede acceder a ellas sin reflexión. Aunque esto parece injusto, el propósito de la depuración es la depuración y no está pensado como una API compatible y, por lo tanto, podría cambiar en cualquier momento, ¡tal vez para mejorar la depuración! El uso de las API públicas admitidas garantizará la compatibilidad con futuras versiones.

Aquí hay otra pregunta de StackOverflow que usa las API públicas:


Respuesta popular

Aquí hay un método de extensión simple para obtener el valor de la propiedad interna utilizando la reflexión.

public static string GetDebugView(this Expression exp)
{
    if (exp == null)
        return null;

    var propertyInfo = typeof(Expression).GetProperty("DebugView", BindingFlags.Instance | BindingFlags.NonPublic);
    return propertyInfo.GetValue(exp) as string;
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow