C#学习教程:如何从lambda表达式中获取引用实例的实例类的方法:_commandExecuter.ProcessCommand(()=>aClass.Method())如何在ProcessCommand方法中获取aClass的实例?我想执行此类的一些附加方法或获取一些属性值。是否可以?编辑:我现在写了一个简单的静态辅助方法来获取实例:privatestaticobjectGetReferredProviderInstance(Expressionbody){if(methodCallExpression!=null){varconstantExpression=methodCallExpression.ObjectasConstantExpression;if(constantExpression!=null)返回constantExpression.Value;}返回空值;方法调用如下所示...Expressionbody=commandToExecute.Body;//这是方法参数ExpressioncommandToExecutevarreferredProviderInstance=GetReferredProviderInstance(body);这里的问题是ConstantExpression被强制转换为Null。因此,constantExpression始终为空。有任何想法吗?编辑2我解决了问题...privatestaticobjectGetReferredProviderInstance(Expressionbody){varmethodCallExpression=bodyasMethodCallExpression;if(methodCallExpression!=null){varmemberExpression=methodCallExpression.ObjectasMemberExpression;if(memberExpression!=null){varconstantExpression=memberExpression.ExpressionasConstantExpression;if(constantExpression!=null)返回constantExpression.Value;}}返回空值;但是这里出现了一个新问题。我只得到我的提供者的引用实例所在的Windows窗体实例。如何获取lambda表达式的真实对象(aClass)?这实际上是可能的,但这取决于您传递给此方法的内容。假设您有一个场景,您将类的实例方法传递给ProcessCommand:}publicboolMethodToCall(){返回真;}voidProcessCommand(Expression>expression){...}}然后您可以使用以下ProcessCommand方法。这只有效,因为在此实例上调用了MethodToCall。voidProcessCommand(Expression>expression){varlambda=(LambdaExpression)表达式;varmethodCall=(MethodCallExpression)lambda.Body;varconstant=(ConstantExpression)methodCall.Object;varmyObject=constant.Value;}一个更复杂的情况如下:publicclassCallingClass{publicvoidTestMethod(){varcalledClass=newCalledClass();ProcessCommand(()=>calledClass.MethodToCall());}voidProcessCommand(Expression>expression){...}}publicclassCalledClass{publicboolMethodToCall(){returntrue;我们调用的方法现在在另一个类中,不是在这个实例上调用,而是在名为calledClass的实例上调用。但是编译器如何将calledClass变量传递给lambda表达式呢?没有定义调用calledClass方法的calledClass字段。编译器通过生成一个名为Class的内部类和一个名为Class的字段来解决这个问题。结果,ProcessCommand方法现在变为:publicvoidProcessCommand(Expression>expression){//表达式是一个带有方法调用主体的lambda表达式。varlambda=(LambdaExpression)表达式;varmethodCall=(MethodCallExpression)lambda.Body;//该方法在某个实例的成员上调用。varmember=(MemberExpression)methodCall.Object;//成员表达式包含匿名类的实例//定义成员...varconstant=(ConstantExpression)member。表达;varanonymousClassInstance=constant.Value;//...和成员本身。varcalledClassField=(FieldInfo)member.Member;//有了匿名类的实例和字段,我们就可以得到它的值。varcalledClass=(CalledClass)calledClassField.GetValue(anonymousClassInstance);}有点复杂,因为编译器必须生成一个匿名内部类。“开箱即用”是不可能的,你可以通过反射破解一些东西,但这是不可取的,它会非常倒退。编辑:实际上根据罗纳德的说法,这是可能的,但仍然很落后。这种隐藏的副作用使代码难以阅读和维护。相反,您的ProcessCommand应该使用整个aClass对象,或者更优选IMyCommand接口与IMyCommand.Method()以及ProcessCommand所需的其他方法和属性。然后aClass.GetType()类型应该实现IMyCommand。以上就是C#学习教程:如何从lambda表达式中获取引用实例实例的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: