如何为表达式构造创建静态lambda?从C#6开始,lambda现在默认是实例方法,并且永远不会是静态的(我假设它们现在总是捕获它们,我认为这更有效[考虑到讨论似乎更快])。请参阅此处:为什么没有捕获的lambda从C#5中的静态更改为C#6中的实例方法?此处:CSC和Roslyn编译器的静态lambda表达式求值的差异?现在,在创建静态MethodInfos以调用表达式方法(如Expression.Convert(Expression,typeof({SomeType}),conversionMethodInfo)之后;将导致使用lambdasExpression.Convert(Expression,typeof({SomeType}),conversionMethodInfo);然后,这样做的新方法是什么?我尝试在lambda中使用“static”修饰符,但它没有用。对于那些无法想象这样的代码的人,这里可能是一个例子:Funcconverter=staticv=>ConvertT1ToT2(v);//(“T”是你想要的任何类型)Expression.Convert(expression,typeof({SomeType}),converter.Method)//(错误:converter.Method.IsStatic为false)是,显然它不起作用。那么,这样做的新方法是什么?没有。规范从不承诺有关lambda表达式的任何实现细节。这就是为什么你不应该依赖它们。这也是C#6的原因中的新功能没有提到这一点。假设您需要将Expression.Convert与自定义MethodInfo一起使用,那么您应该将lambda提升为静态方法:privatestaticT2Converter(T1v){returnConvertT1ToT2(v);}...MethodInfoconverter=typeof(ThisType).GetMethod("Converter",BindingFlags.NonPublic|BindingFlags.Static);//或者:MethodInfoconverter=((Func)Converter).Method;Expression.Convert(expression,typeof(SomeType),converter)这样,您不使用lambda,因此MethodInfo保证引用静态方法。万一其他人想知道,最后,我不得不概括(降级)我的表达式以“表达主体的函数成员”,如下所示://(类方法)staticstring_Convert(objectobj)=>(obj作为SomeType)?.SomeProperty??ReturnSomethingElse;然后在我的方法体中:FuncconversionDelegate=_Convert;表达式exp=Expression.Convert(expression,typeof(SomeType),conversionDelegate.Method);编辑:这里有人说非捕获/静态lambda:https://github.com/dotnet/csharplang/issues/275以上是C#学习教程:Howtocreateastaticlambdaforexpressionconstruction?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
