Как получить значение, хранящееся в выражении вызова linq - PullRequest
0 голосов
/ 15 февраля 2012

Я расширяю Dynamic.cs, чтобы квалифицировать его для использования с индексаторами.В этом случае мне нужно получить индекс, который хранится в выражении вызова.В отладчике я вижу:

 -      left    {Param_0.get_Item(0)}   System.Linq.Expressions.Expression {System.Linq.Expressions.InstanceMethodCallExpressionN}
    -   Arguments   Count = 1   System.Collections.ObjectModel.ReadOnlyCollection<System.Linq.Expressions.Expression> {System.Runtime.CompilerServices.TrueReadOnlyCollection<System.Linq.Expressions.Expression>}
        -   [0] {0} System.Linq.Expressions.Expression {System.Linq.Expressions.ConstantExpression}
            CanReduce   false   bool
            DebugView   "0" string
            NodeType    Constant    System.Linq.Expressions.ExpressionType
            + Type  {Name = "Int32" FullName = "System.Int32"}  System.Type {System.RuntimeType}
            Value   0   object {int}
    +   Rohdatenansicht     

То, что я хочу:

left.Arguments[0].Value

Как я могу получить это?

Anуродливый метод, возможно, будет использовать left.ToString ().Это приведет к: «Param_0.get_Item (0)» Там я могу извлечь параметр get_Item ().Но я думаю, что это не правильный путь.

1 Ответ

2 голосов
/ 16 февраля 2012

Чтобы получить это значение, вам просто нужно привести выражения к нужным типам:

Expression left = …

var methodCall = (MethodCallExpression)left;

var constant = (ConstantExpression)methodCall.Arguments[0];

int value = (int)constant.Value;

В качестве альтернативы, вы можете использовать dynamic:

dynamic dynamicLeft = left;

int value = dynamicLeft.Arguments[0].Value;
...