当前位置: 首页 > 编程语言 > C#

如何从c#中的MethodCallExpression调用该方法分享

时间:2023-04-11 01:07:47 C#

C#学习教程:如何在c#中调用MethodCallExpression中的方法我找到了一种方法,但我在检索参数值时遇到问题,因为并非每个参数都用ConstantExpression描述。表达式<动作>=t=>t.DoSomething(Par0,Par1,Par2);MethodCallExpressionmethodCallExpression=selector.BodyasMethodCallExpression;//从提供的//lambda表达式中获取调用方法所需的信息。MethodInfomethodInfo=methodCallExpression.Method;object[]arguments=methodCallExpression.Arguments.OfType().Select(p=>p.Value).ToArray();//在可枚举的foreach(TSourceiteminsource)中的每个项目上调用表达式{methodInfo.Invoke(item,arguments);此外,我还看到了调用该方法的其他方式,现在我不确定这是什么。varfunc=expression.Compile();varsuccess=func.Invoke();所以我的问题是,如何从methodCallExpression.Arguments中检索方法参数值?还是有更简单的方法来实现我的目标?您不必担心自己检索参数和调用MethodInfo,您可以让.NET为您完成这些工作。您需要做的就是创建一个包含该方法的Lambda表达式。例如。MethodCallExpression表达式=GetExpressionSomeHow();objectresult=Expression.Lambda(expression).Compile().DynamicInvoke();这就是我在Linq提供程序中处理嵌套查询的方式。编辑:实际上,看起来您可能已经在选择器变量中有一个LambdaExpression。在这种情况下,您应该可以直接编译和调用它:objectresult=selector.Compile().DynamicInvoke();编译表达式是一个非常密集的操作,所以如果你打算重新使用表达式,我只会这样。否则我会推荐反射方式;你会发现它执行得更快。切勿在紧密循环中调用expression.Compile()。@Ch00k选择器.编译();给你一个代表。对于实例方法,你需要一个实例来调用这个方法。您将此实例作为参数传递给DynamicInvokeala//从MyClass中获取方法-param1和param2是您要传递给方法调用的实际参数。表达式>选择器=(x=>x.MyMethod(param1,param2));//创建一个MyClass的实例来调用方法varmyClass=newMyClass();//通过DynamicInvoke对象调用myClass上的方法returnValue=selector.Compile().DynamicInvoke(myClass);expression.call编译为Action或Func,执行以下操作:varmethod=typeof(MyType).GetMethod(nameof(MyType.MyMethod),BindingFlags.Public|BindingFlags.Static);varparameter=Expression.Parameter(typeof(string),"s");varcall=Expression.Call(方法,参数);varlambda=Expression.Lambda>(call,call.Arguments.OfType());varfunc=lambda.Compile();intresult=func("样本字符串输入");这使您可以简单地执行func.Invoke("mystring")或func("mystring");这里的秘诀是您需要传递与创建Expression.Call时使用的参数相同的参数,否则您将获得类型为“System.String”的类型为“InvalidOperationException”的变量错误,但未定义我会尝试返回对象:privatestaticobject_getValue(MethodCallExpressionexpression){varobjectMember=Expression.Convert(expression,typeof(object));vargetterLambda=Expression.Lambda>(objectMember);vargetter=getterLambda.Compile();返回吸气剂();}以下内容可以调用的更快:以上是C#学习教程:HowtocallthismethodfromMethodCallExpressioninc#分享的所有内容,如果对大家有用还有需要了解更多C#学习教程的,希望大家会多关注——LambdaExpressionl=Expression.Lambda(Expression.Convert(element,element.Type));返回l.Compile().DynamicInvoke();本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢