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,匿名类型包含AnonymousTypethis必须是正常类型:不是CompilerGenerated也不是以<以上启发式方法是否足以区分实常数this,闭包和匿名类型?即有这些启发式失败的情况,或者我错过了什么?这可能会在未来的.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();
}
}
Run Code Online (Sandbox Code Playgroud)
动力就是要走得快。
编辑2:明白了