启发式"this"和闭包好吗?(表达树)

Eam*_*nne 6 .net linq expression-trees

考虑以下表达式:

class A {
    int x;
    public void Method(int y) {
        Expression<Func<bool>> expr=() => x == y;
        //...
Run Code Online (Sandbox Code Playgroud)

这里,表达式涉及一个自动创建的闭包y,以及(隐式)this类型的引用.两者都将被表示为在表达式树中.给定一个表达式,例如带有此引用和/或闭包的更复杂的表达式,我想要识别特定实际上是"this"或隐式构造的闭包,以便能够从表达式树(ExpressionToCode)重新生成C#.Athis.xMemberExpressionConstantExpressionexprConstantExpression

我使用一些启发式方法构建了一个"解决方案",因为似乎没有一个完美的解决方案.

  • 闭包和thislambda总是在ConstantExpressions.
  • 关闭,this永远不会null.
  • 两者都是类,而不是值类型 - 您无法this从结构中捕获引用.这是相当幸运的,因为讲default(StructType).Method()this.Method(),否则是不可能的,每当this == default(StructType).
  • 内置类型(字符串,枚举,十进制,类型,所有基元)实际上是实常数,不是this或闭包
  • 闭包和匿名类型以&开头<并注释CompilerGeneratedAttribute
    • 闭包名称包含字符串DisplayClass,匿名类型包含AnonymousType
    • 匿名类型是通用的,闭包不是.
    • 闭包是嵌套类,而匿名类型则不是.
  • this必须是正常类型:不是CompilerGenerated也不是以<

以上启发式方法是否足以区分实常数this,闭包和匿名类型?即有这些启发式失败的情况,或者我错过了什么?这可能会在未来的.NET版本中破裂吗?

编辑:我首先以开放的方式问这个问题,没有结果; 我重写了这个问题,包括我到目前为止所提出的问题.任何建议都非常感激 - 赏金即将到期,任何想法都是受欢迎的......

Gui*_*e86 2

好的,我设法从表达式中找到 A 类型:

class Program
{
    class A
    {
        int x;
        public Expression<Func<bool>> Method(int y)
        {
            Expression<Func<bool>> expr = () => x == y;
            return expr;
        }
    }

    static void Main(string[] args)
    {
        var expr = new A().Method(10);

        dynamic body = expr.Body;

        A instance = body.Left.Expression.Value;

        Console.Write(instance.ToString());

        Console.ReadKey();
    }
 }
Run Code Online (Sandbox Code Playgroud)

动力就是要走得快。

编辑2:明白了