Эвристика для «этого» и замыканий в порядке? (Деревья выражений)

Рассмотрим следующее выражение:

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 .
  • Closures и this никогда не null .
  • Оба класса, не типы значений - вы не можете захватить ссылку на this из структуры. Это очень удачно, потому что указать default (StructType) .Method () из this.Method () в противном случае было бы невозможно, когда this == default (StructType) .
  • Встроенные типы (string, Enums, decimal, Type, все примитивы) на самом деле являются реальными константами, а не this или закрытие
  • Замыкания и анонимные типы начинаются с и аннотированы CompilerGeneratedAttribute
    • Имена замыканий содержат строку DisplayClass , анонимные типы содержат AnonymousType
    • Анонимные типы являются универсальными, замыкания - нет.
    • Замыкания являются вложенными классами , анонимные типы - нет.
  • this должен быть нормальным типом: not CompilerGenerated и не начинается с

Достаточно ли вышеприведенной эвристики, чтобы различать реальные константы, this , замыкания и анонимные типы? Т.е. есть случаи, когда эта эвристика не работает, или я что-то упускаю? Может ли это нарушиться в будущих версиях .NET?

Изменить: Сначала я задал этот вопрос открытым способом, безрезультатно; Я переписал вопрос, включив в него то, что придумал до сих пор. Приветствуются любые предложения - завтра истекает срок щедрости, любые идеи приветствуются ...

6
задан Eamon Nerbonne 27 January 2011 в 09:03
поделиться