如何创建一个静态lambda用于表达式构建?

时间:2017-04-04 21:17:03

标签: c# lambda c#-6.0

从C#6开始,lambdas现在默认为实例方法,并且永远不会是静态的(我假设它们现在总是捕获它们,我认为它更有效[考虑到讨论似乎更快]。)

见这里:Why has a lambda with no capture changed from a static in C# 5 to an instance method in C# 6?

在这里:Difference in CSC and Roslyn compiler's static lambda expression evaluation?

现在在创建静态MethodInfos以调用表达式方法(例如Expression.Convert(Expression, typeof({SomeType}), conversionMethodInfo);

时使用lambdas时会出现问题

那么,这样做的新方法是什么?我尝试将“静态”修饰符与lambdas一起使用,但它不起作用。对于那些无法想象这些代码的人来说,这可能就是一个例子:

Func <T1,T2> converter = static v => ConvertT1ToT2(v); // ('T' is whatever type you want)
Expression.Convert(expression, typeof({SomeType}), converter.Method) // (error: converter.Method.IsStatic is false)

是的,显然它不起作用。

2 个答案:

答案 0 :(得分:5)

  

那么,这样做的新方法是什么?

没有。规范从未承诺任何关于lambda表达式的实现细节。这就是为什么你不应该依赖它们。这也是What's new in C# 6没有提到这一点的原因。

假设您需要将ReflectionException in RouteDependencyResolverTrait.php line 57: Internal error: Failed to retrieve the default value与自定义Expression.Convert一起使用,那么您应该将lambda提升为MethodInfo方法:

static

这样,您就不会使用lambda,因此保证private static T2 Converter(T1 v) { return ConvertT1ToT2(v); } … MethodInfo converter = typeof(ThisType).GetMethod("Converter", BindingFlags.NonPublic | BindingFlags.Static); // OR: MethodInfo converter = ((Func<T1, T2>)Converter).Method; Expression.Convert(expression, typeof(SomeType), converter) 引用MethodInfo方法。

答案 1 :(得分:0)

如果其他人想知道,最后,我必须将我的表达推广(降级)给表达身体的功能成员&#34;相反,像这样:

// (class method)
static string _Convert(object obj) => (obj as SomeType)?.SomeProperty ?? ReturnSomethingElse;

然后在我的方法体中:

Func<object, string> conversionDelegate = _Convert;
Expression exp = Expression.Convert(expression, typeof(SomeType), conversionDelegate.Method);

编辑:有人在这里讨论非捕获/静态lambda:https://github.com/dotnet/csharplang/issues/275