Accesso a Expression.DebugView dal codice

c# expression-trees

Domanda

Sto creando un albero di espressioni manualmente come questo

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);

Quando guardo DebugView in modalità di debug, vedo 3 + (5 + 9) * 2, che è quello che vorrei trasmettere dal mio programma. Capisco che stia usando il visualizzatore di espressioni tree. C'è un modo per usarlo dal mio codice? Grazie!

Risposta accettata

Le classi che implementano le funzionalità di visualizzazione del debug sono intenzionalmente internal modo che non sia possibile accedervi senza una riflessione. Sebbene ciò sembri ingiusto, lo scopo del debug è il debugging e non è inteso come un'API supportata e quindi potrebbe cambiare in qualsiasi momento, forse per migliorare il debugging! L'utilizzo delle API pubbliche supportate assicurerà la compatibilità con le versioni future.

Ecco un'altra domanda StackOverflow che utilizza le API pubbliche:


Risposta popolare

Ecco un semplice metodo di estensione per ottenere il valore della proprietà interna mediante la riflessione.

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;
}


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché