gpt4 book ai didi

c# - 如何解析一个简单的捕获闭包表达式并获取目标对象和选择器

转载 作者:行者123 更新时间:2023-11-30 23:24:16 25 4
gpt4 key购买 nike

如果我有简单的类

class Foo {
int Value { get; set; } = 20
}

class Bar {
Foo foo { get; set;} = new Foo();
}

然后我写一个选择器表达式

var bar = new Bar();
Expression<Func<int>> fn = () => bar.foo.Value;

我知道如果我输入

var v = fn.Compile()()

v 将等于 20 表明确实捕获了闭包。我推断在表达式内部存储了对捕获的表达式目标的引用。我想把这个从表达式中拿回来。

例如

Bar capturedBar = GetTarget(fn);
Assert(capturedBar == bar);

还有一个函数

string selector = GetSelector(fn)

应该返回

"bar.foo.A"

最佳答案

您可以使用 Expression Visitor 完成此任务技术。

这里是主要思想的简单而肮脏的演示:

var bar = new Bar();
Expression<Func<int>> fn = () => bar.foo.Value;

BarExtractor be = new BarExtractor();
be.Visit(fn);
Bar capturedBar = be.bar;

BarExtractor 类声明如下:

class BarExtractor : ExpressionVisitor {
public Bar bar;
protected override Expression VisitConstant(ConstantExpression node) {
object closureObj = node.Value;
if(closureObj != null && closureObj.GetType().Name.StartsWith("<>c__DisplayClass")) {
var barField = closureObj.GetType().GetField("bar");
if(barField != null && barField.FieldType == typeof(Bar))
bar = barField.GetValue(closureObj) as Bar;
}
return base.VisitConstant(node);
}
}

关于c# - 如何解析一个简单的捕获闭包表达式并获取目标对象和选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37874366/

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