Mic*_*lle 8 c# lambda boxing unboxing expression
我正在尝试转换一个
Expression<Func<T,object>>
Run Code Online (Sandbox Code Playgroud)
到了
Expression<Func<T,bool>>
Run Code Online (Sandbox Code Playgroud)
目前,手表向我显示我的表情
Expression<Func<T,object>> myExpression = model=>Convert(model.IsAnAirplane)
Run Code Online (Sandbox Code Playgroud)
我想简化这个
Expression<Func<T,bool>> myExpression = model=>model.IsAnAirplane
Run Code Online (Sandbox Code Playgroud)
目前我只成功添加转换,导致:
Expression<Func<T,bool>> myExpression = model=>Convert(Convert(model.IsAnAirplane))
Run Code Online (Sandbox Code Playgroud)
但由于底层类型是一个bool,我应该能够完全划伤转换器,对吧?我熟悉表达式访问者等,但仍然无法弄清楚如何删除转换.
编辑:这个问题的接受答案表达式<Func <T,对象>>到表达式<Func <T,TResult >>(可能是重复的)的通用拆箱对我来说不起作用...作为表达式由EF翻译,你可以看到它转换(转换())而不是只删除第一个转换...,这导致"无法转换类型'System.Boolean'来键入'System.Object'.LINQ to Entities仅支持转换EDM原语或枚举类型."
您应该能够Convert使用以下内容删除任何包装器:
Expression<Func<YourModel, object>> boxed = m => m.IsAnAirplane;
var unboxed = (Expression<Func<YourModel, bool>>)StripConvert(boxed);
// ...
public static LambdaExpression StripConvert<T>(Expression<Func<T, object>> source)
{
Expression result = source.Body;
// use a loop in case there are nested Convert expressions for some crazy reason
while (((result.NodeType == ExpressionType.Convert)
|| (result.NodeType == ExpressionType.ConvertChecked))
&& (result.Type == typeof(object)))
{
result = ((UnaryExpression)result).Operand;
}
return Expression.Lambda(result, source.Parameters);
}
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以StripConvert改为返回Expression<Func<T,U>>而不是普通LambdaExpression并在方法本身内执行转换,但在这种情况下,您将无法利用类型推理进行方法调用.
| 归档时间: |
|
| 查看次数: |
720 次 |
| 最近记录: |