consideri la seguente espressione:Euristico per "questo" e chiusure OK? (alberi Expression)
class A {
int x;
public void Method(int y) {
Expression<Func<bool>> expr=() => x == y;
//...
Qui, l'espressione comporta una chiusura creato automaticamente y
, e un riferimento a this
di tipo A
per la (implicito) this.x
. Entrambi saranno rappresentati come MemberExpression
su un ConstantExpression
nell'albero delle espressioni. Data un'espressione come expr
o un'espressione più complicata con questo riferimento e/o una chiusura, Voglio identificare che un particolare è in realtà "questo" o una chiusura implicitamente costruita per poter rigenerare C# da un albero di espressioni (ExpressionToCode).
Ho costruito una "soluzione" utilizzando una certa euristica poiché non sembra essere una soluzione perfetta.
- Chiusure e
this
in lambda sono sempre inConstantExpressions
. - Le chiusure e
this
non sono mainull
. - Entrambe sono classi, non tipi di valore: non è possibile acquisire un riferimento a
this
da una struttura. Questo è abbastanza fortunato, perché diredefault(StructType).Method()
dathis.Method()
sarebbe altrimenti impossibile ogni voltathis == default(StructType)
. - tipi interni (stringhe, enumerazioni, decimale, tipo, tutte le primitive) sono costanti in realtà vere, non
this
o una chiusura - Chiusure e tipi anonimi Iniziamo con
<
e è annotato conCompilerGeneratedAttribute
- nomi di chiusura contengono la stringa
DisplayClass
, i tipi anonimi contengonoAnonymousType
- I tipi anonimi sono generici, le chiusure non lo sono.
- Le chiusure sono classi nidificate, i tipi anonimi no.
- nomi di chiusura contengono la stringa
this
deve essere un tipo normale: nonCompilerGenerated
e non inizia con<
Sono le euristiche di cui sopra sufficienti per distinguere tra costanti reali, this
, chiusure e tipi anonimi? Cioè ci sono casi in cui queste euristiche falliscono o mi manca? È probabile che si rompa nelle versioni future di .NET?
Edit: ho fatto questa domanda in modo aperto, senza esito; Ho riscritto la domanda per includere ciò che ho scoperto finora. Tutti i suggerimenti molto apprezzato - domani scadenza del Bounty, qualsiasi idea a tutti è il benvenuto ...
Sei sicuro che la tua ipotesi è corretta? Secondo me (non sono un esperto;)), la x nell'espressione potrebbe essere solo un 'riferimento' a un int senza alcuna conoscenza di A (e non c'è modo di trovare un A dall'espressione) – Guillaume86
ok ho sbagliato è possibile con gli alberi di espressione (ed è ovvio ^^) – Guillaume86
Sono sicuro che è possibile avvicinarsi a una risposta. Non sono sicuro che sia possibile - Ho aggiunto le mie attuali idee sull'argomento, che sono necessarie per rilevare e differenziare tra tipi generati dal compilatore, costanti reali e tipi di utenti - e notare che il compilatore genera anche anonimi tipi che non sono per chiusure. –