从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一起使用,但它不起作用。对于那些无法想象这些代码的人来说,这可能就是一个例子:
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)
是的,显然它不起作用。
答案 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