我正在尝试评估常量表达式的值。在调试器中,我可以看到值:
但我如何在代码中获取它?
表达式的格式为:
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
谢谢!
答案 0 :(得分:4)
您还可以尝试以下操作:
LambdaExpression lambda = Expression.Lambda(exp.Arguments[0]);
var val = lambda.Compile().DynamicInvoke();
答案 1 :(得分:3)
AHA!
(exp.Arguments[0] as MemberExpression).Member
是FieldInfo
所以我可以这样做:
((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,用于识别常量表达式
我已成功使用它了。
答案 3 :(得分:-3)
右键单击调试器中表达式的名称,选择“添加监视”,然后将名称复制到代码中。