Рассмотрим следующее выражение:
class A {
int x;
public void Method(int y) {
Expression> expr=() => x == y;
//...
Здесь выражение включает автоматически созданное закрытие для y
и ссылку на this
типа A
для (неявного) this.x
. Оба будут представлены как MemberExpression
на ConstantExpression
в дереве выражения. Учитывая такое выражение, как expr
или более сложное выражение с ссылкой this и / или закрытием, я хочу идентифицировать, что конкретное ConstantExpression
на самом деле является «этим» или неявно сконструированное замыкание , чтобы иметь возможность регенерировать C # из дерева выражений ( ExpressionToCode ).
Я построил «решение», используя некоторые эвристики, так как, похоже, не существует идеального решения.
this
в лямбдах всегда находятся в ConstantExpressions
. this
никогда не null
. this
из структуры. Это очень удачно, потому что указать default (StructType) .Method ()
из this.Method ()
в противном случае было бы невозможно, когда this == default (StructType)
. this
или закрытие и аннотированы CompilerGeneratedAttribute
- Имена замыканий содержат строку
DisplayClass
, анонимные типы содержат AnonymousType
- Анонимные типы являются универсальными, замыкания - нет.
- Замыкания являются вложенными классами , анонимные типы - нет.
this
должен быть нормальным типом: not CompilerGenerated
и не начинается с
Достаточно ли вышеприведенной эвристики, чтобы различать реальные константы, this
, замыкания и анонимные типы? Т.е. есть случаи, когда эта эвристика не работает, или я что-то упускаю? Может ли это нарушиться в будущих версиях .NET?
Изменить: Сначала я задал этот вопрос открытым способом, безрезультатно; Я переписал вопрос, включив в него то, что придумал до сих пор. Приветствуются любые предложения - завтра истекает срок щедрости, любые идеи приветствуются ...