表达式树——如何获取声明实例?我是表达式树方面的新手,所以我不确定如何提出这个问题或使用什么术语。这是我正在尝试做的一个过于简单的版本:Barbar=newBar();Zap(()=>bar.Foo);publicstaticvoidZap(Expressionsource){//在这里帮助://我想获取bar实例并调用bar.Zim()或其他一些方法。我如何在Zap方法中使用bar?由于传递给Zap方法的表达式是一棵树,您可以简单地使用表达式树访问者来遍历树并找到表达式中的第一个ConstantExpression。它可以按以下顺序排列:(((source.BodyasMemberExpression).ExpressionasMemberExpression).ExpressionasConstantExpression).Value请注意,bar实例由作为内部类实现的闭包捕获,该实例作为成员,这是第二个MemberExpression的来源。编辑然后你必须像这样从生成的闭包中获取字段:staticvoidMain(string[]args){varbar=newBar();bar.Foo="你好,Zap";Zap(()=>bar.Foo);}privateclassBar{publicStringFoo{get;放;}}publicstaticvoidZap(Expression>source){varparam=(((source.BodyasMemberExpression).ExpressionasMemberExpression).ExpressionasConstantExpression).Value;vartype=param.GetType();//请注意,C#编译器使用在Main()中捕获的局部变量的名称创建闭包类的字段//varfield=type.GetField("bar");varbar=field.GetValue(param)asBar;Debug.Assert(bar!=null);控制台.WriteLine(bar.Foo);如果你知道“bar”的类型,你可以做(??我在这里重复使用codekaizen的回答中的一些东西):staticvoidMain(string[]args){varbar=newBar();bar.Foo="你好,Zap";Zap(()=>bar.Foo);控制台.ReadLine();}privateclassBar{publicStringFoo{get;放;}}publicstaticvoidZap(Expression>source){varbody=source.BodyasMemberExpression;条形测试=Expression.Lambda>(body.Expression).Compile()();Console.WriteLine(test.Foo);在大多数情况下,您可以在表达式树中找到表示对象的表达式,然后编译并执行该表达式并获取对象(但顺便说一下,这不是一个非常快速的操作)所以,您缺少的是Compile()方法。您可以在此处找到更多信息:如何:执行表达式树。在这段代码中,我假设您总是传递类似“()=>object.Member”的表达式。对于真实场景,您需要分析是否有所需的表达式(例如,如果不是MemberExpression则抛出异常)。或者使用ExpressionVisitor,这有点棘手。我最近在这里回答了一个非常相似的问题:HowdoIsubscribeanobject'seventsinanexpressiontree?站在上面巨人的肩膀上,我提取表示表达式源的类实例的最终扩展方法如下所示:publicstaticTInGetSource(thisExpression>property)whereTIn:class{MemberExpressionmemberExpression=(MemberExpression)财产。身体;TIninstance=Expression.Lambda>(memberExpression.Expression).Compile()();返回实例;感谢所有人,我建立在上面所有答案之上。以上就是C#学习教程:表达式树——如何获取声明实例?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: