如何从()=>foo.Title表达式获取对象实例{得到;放;我试图通过调用函数BindToText(titleTextBox,()=>foo.Title)来简化数据绑定;声明为voidBindToText(Controlcontrol,Expressionproperty){varmex=property.BodyasMemberExpression;字符串名称=mex.Member.Name;control.DataBindings.Add("文本",???,名称);}所以我该怎么做???对于我的Foo类的一个实例。如何从lambda表达式中获取对调用foo实例的引用?编辑:实例应该在某个地方,因为我可以调用property.Compile()并创建一个在我的BindToText函数中使用foo实例的委托。所以我的问题是,如果不在函数参数中添加对实例的引用,是否可以做到这一点。我向Occum'sRazor寻求最简单的解决方案。编辑2:很多人没有注意到的是,如果我编译lambda,在我的函数中访问foo实例时存在的闭包。为什么编译器知道在哪里可以找到实例而我不知道?我坚持认为必须有一个答案,而不需要经过额外的论证。解决方案感谢VirtualBlackFox,解决方案是这样的:voidBindText(TextBoxBasetext,Expressionproperty){varmex=property.BodyasMemberExpression;字符串名称=mex.Member.Name;varfex=mex.ExpressionasMemberExpression;varcex=fex.ExpressionasConstantExpression;varfld=fex.MemberasFieldInfo;varx=fld.GetValue(cex.Value);text.DataBindings.Add("文本",x,名称);这让我只需要输入BindText(titleText,()=>foo.Title);.您想要的小LINQPad模型:voidFoo(Expression>prop){varpropertyGetExpression=prop.BodyasMemberExpression;//显示你正在访问的属性,这里是“Height”propertyGetExpression.Member.Name.Dump();//"s"被闭包中编译器生成类的字段访问替换varfieldOnClosureExpression=propertyGetExpression.ExpressionasMemberExpression;//找到编译器生成的类varclosureClassExpression=fieldOnClosureExpression.ExpressionasConstantExpression;varclosureClassInstance=closureClassExpression.Value;//找到字段值,在本例中它是对“s”变量的引用varclosureFieldInfo=fieldOnClosureExpression.MemberasFieldInfo;varclosureFieldValue=closureFieldInfo.GetValue(closureClassInstance);closureFieldValue.Dump();//我们知道表达式是一个属性访问,所以我们得到PropertyInfo实例//甚至访问值(是的,编译表达式会h已经更简单了:D)varpropertyInfo=propertyGetExpression.MemberasPropertyInfo;varpropertyValue=propertyInfo.GetValue(closureFieldValue,null);propertyValue.Dump();}voidMain(){strings="Helloworld";Foo(()=>s.Length);不要只是修改方法以采用另一个参数,如#3444294中所述。对于您的示例,它可能如下所示:voidBindToText(Controlcontrol,TdataSource,Expression>property){varmex=property.BodyasMemberExpression;字符串名称=mex.Member.Name;control.DataBindings.Add("文本",数据源,名称);}并将被称为BindToText(titleTextBox,foo,()=>foo.Title);不错,但很容易理解。没有魔法发生。;)像下面这样的东西应该起作用:voidBindToText(Controlcontrol,Expression>property){varmex=property.BodyasMemberExpression;字符串名称=mex.Member.Name;varfooMember=mex.ExpressionasMemberExpression;varfooConstant=fooMember.ExpressionasConstantExpression;varfoo=fooConstant.Value;control.DataBindings.Add("文本",foo,名称);如果这对您不起作用,请告诉我。以上就是C#学习教程:如何从()=>foo.Title表达式中获取对象实例共享的所有内容。如果对你有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: