如何获得constantexpression的价值

时间:2011-06-23 10:09:57

标签: c#

我正在尝试评估常量表达式的值。在调试器中,我可以看到值:

watch

但我如何在代码中获取它?

表达式的格式为:

x => x.ListPropery[5].ChildProperty

我正在沿着表达式将其转换为字符串,但我已经陷入了索引器部分。

索引器在MethodCallExpression上创建一个IList<>get_Item,然后我可以按照自己的方式进入参数,得到一个如下生成的常量表达式:

for(var i = 0; i < list.Count; i++)
{
    var j = i;
    Expression<Func<IList<TValue>, TValue>> indexer = xs => xs[j];

更新

(exp.Arguments[0] as MemberExpression).Member

返回MemberInfo

谢谢!

4 个答案:

答案 0 :(得分:4)

您还可以尝试以下操作:

LambdaExpression lambda = Expression.Lambda(exp.Arguments[0]);
var val = lambda.Compile().DynamicInvoke();

答案 1 :(得分:3)

AHA!

(exp.Arguments[0] as MemberExpression).MemberFieldInfo

所以我可以这样做:

((exp.Arguments[0] as MemberExpression).Member as FieldInfo).GetValue(((exp.Arguments[0] as MemberExpression).Expression as ConstantExpression).Value)

答案 2 :(得分:2)

关于建立LinqProvider的文章很棒。

http://blogs.msdn.com/b/mattwar/archive/2008/11/18/linq-links.aspx

在本部分中,有一个Evaluator,用于识别常量表达式

http://blogs.msdn.com/b/mattwar/archive/2007/08/01/linq-building-an-iqueryable-provider-part-iii.aspx

我已成功使用它了。

答案 3 :(得分:-3)

右键单击调试器中表达式的名称,选择“添加监视”,然后将名称复制到代码中。