expr=() => x == y;-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:48:22 25 4
gpt4 key购买 nike

考虑以下表达式:

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

这里,表达式涉及为 y 自动创建的闭包。 ,以及对 this 的引用类型 A对于(隐式) this.x .两者都将表示为 MemberExpressionConstantExpression在表达式树中。给定一个表达式,例如 expr或更复杂的表达式,带有 this 引用和/或闭包, 我想确定一个特定的 ConstantExpression实际上是“this”或隐式构造的闭包能够从表达式树 ( ExpressionToCode ) 重新生成 C#。

我使用一些启发式方法构建了一个“解决方案”,因为似乎没有完美的解决方案。
  • 关闭和 this在 lambda 中总是在 ConstantExpressions .
  • 关闭和 this永远不会null .
  • 两者都是类,而不是值类型 - 您无法捕获对 this 的引用从一个结构。这很幸运,因为告诉default(StructType).Method()来自 this.Method()否则,无论何时 this == default(StructType) 都是不可能的.
  • 内置类型(字符串、枚举、十进制、类型、所有原语)实际上是实常数,而不是 this或关闭
  • 闭包和匿名类型以 < 开头并用 CompilerGeneratedAttribute 注释
  • 闭包名称包含字符串 DisplayClass , 匿名类型包含 AnonymousType
  • 匿名类型是通用的,闭包不是。
  • 闭包是嵌套类,匿名类型不是。
  • this必须是普通类型:不是 CompilerGenerated并且不以 < 开头

  • 上述启发式是否足以区分实常数, this ,闭包和匿名类型? IE。是否存在这些启发式失败的情况,或者我遗漏了什么?这在 future 的 .NET 版本中可能会中断吗?

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

    最佳答案

    好的,我设法从表达式中找到了 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();
    }
    }

    动态就是要走得快。

    编辑2:明白了

    关于.net - "this"的启发式和闭包好吗? (表达式树),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4722562/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com