问题 在表达式树中检查了类型转换?


我正在使用Expression来创建一些动态生成的代码。我的解决方案有效,除了一个功能:我想做一个检查类型转换,如果转换失败,则抛出TypeCastException。

我找到了Expression.TypeAs(),它执行类型转换,但是当转换失败时它返回null而不是throw。

是否有一种简单的方法可以在Expression中执行检查类型转换?或者我是否必须检查null并自己抛出异常?

这就是我所拥有的: -

ParameterExpression typedAttribute = Expression.Variable(attributeType, "typedAttribute");
ParameterExpression typedValue = Expression.Variable(valueType, "typedValue");

BlockExpression methodBlock = Expression.Block(new[] { typedAttribute, typedValue }, new Expression[]
   {
       Expression.Assign(typedAttribute, Expression.TypeAs(attribute, attributeType)),
       Expression.Assign(typedValue, Expression.TypeAs(value, valueType)),
       Expression.Call(visitor, methodInfo, typedAttribute, typedValue),
       Expression.Assign(visited, Expression.Constant(true)),
   });

9300
2018-06-27 07:33


起源



答案:


Expression.Convert 应该在这里扮演一个角色。


13
2018-06-27 07:35



谢谢,这很有效。我实际上记得早些时候尝试过Expression.Convert(),但我认为我当时的代码中有另一个错误,这使我无法看到它是正确的解决方案。无论如何,很高兴有一个明确的答案这么快! - PeteAC
有更快的演员?我正在创建编译的setter / getters,但拳击拆箱对象减慢了一切。 - Demetris Leptos
@Demetris然后:不要使用盒装数据......很难说没有上下文的话 - Marc Gravell♦
@MarcGravell首先感谢您的投入。所以你是说避免使用valuetype来反对或者通常是any-type to object?我需要Func <object,object>和Action <object,object>的通用“接口” - 特别是在级联“elvis”类似的调用上。 - Demetris Leptos
@Demetris有一个Func-object-object或者类似物, 和 使用值类型,和 避免拳击以获得最佳性能...你不能拥有所有3。 - Marc Gravell♦


答案:


Expression.Convert 应该在这里扮演一个角色。


13
2018-06-27 07:35



谢谢,这很有效。我实际上记得早些时候尝试过Expression.Convert(),但我认为我当时的代码中有另一个错误,这使我无法看到它是正确的解决方案。无论如何,很高兴有一个明确的答案这么快! - PeteAC
有更快的演员?我正在创建编译的setter / getters,但拳击拆箱对象减慢了一切。 - Demetris Leptos
@Demetris然后:不要使用盒装数据......很难说没有上下文的话 - Marc Gravell♦
@MarcGravell首先感谢您的投入。所以你是说避免使用valuetype来反对或者通常是any-type to object?我需要Func <object,object>和Action <object,object>的通用“接口” - 特别是在级联“elvis”类似的调用上。 - Demetris Leptos
@Demetris有一个Func-object-object或者类似物, 和 使用值类型,和 避免拳击以获得最佳性能...你不能拥有所有3。 - Marc Gravell♦