используя ExpressionVisitor, как динамически получить значение оценки выражения ParameterExpression - PullRequest
0 голосов
/ 01 мая 2019

У меня есть выражение, которое принимает выражение в качестве одного из своих параметров:

enter image description here

Я использую ExpressionVisitor для получения значений констант см. Этот пост SO .

но если член относится к типу memberAccess, я хочу иметь возможность оценить, каково будет действительное значение этого параметра. В этом примере ($obj.Name).Length.

пример хочет проверить, больше ли int (первое значение), чем второе значение (в данном случае выражение). Если это константа, я знаю, как получить их значение, но я не могу понять, как оценить выражение на лету.

Я передал весь объект и все выражение в ExpressionVisitor, чтобы они были доступны для использования при необходимости.

internal class ValueExtractor : ExpressionVisitor
{
    private readonly object _item;
    private readonly MethodCallExpression _wholeExpression;

    public List<object> Arguments { get; }

    protected override Expression VisitMember(MemberExpression node)
    {
       if (memberType == ExpressionType.MemberAccess)
       {
           var exp = Expression.Lambda<Func<int>>(node, false, NotSureAboutThis);
           exp.Compile().Invoke(NotSureWhichPropGoesHere);
       }

    }
}

Значение узла в VisitMember:

enter image description here

У меня есть доступ к T и TMember. где T - главный объект, все это называется (имеет свойство Age), а TMember - int в этом случае (Age).

Я не уверен, что приведенный выше пример идет в правильном направлении, если это не так, я не уверен, как это закончить.

...