Учитывая тип ExpressionType. MemberAccess, как я получаю значение поля?

Я попробовал несколько решений, но его единственный, который действительно работал для меня во всех браузерах

let newTab = window.open(); newTab.location.href = url;

33
задан Keith Fitzgerald 27 October 2008 в 01:26
поделиться

2 ответа

[обновленный для ясности]

Сначала; бросьте Expression к MemberExpression.

А MemberExpression имеет две вещи интереса:

  • .Member - PropertyInfo / FieldInfo участнику
  • .Expression - выражение для оценки для получения "obj" для.Member

т.е. если можно оценить .Expression к "obj", и эти .Member, FieldInfo, затем можно получить фактическое значение через .GetValue(obj) на FieldInfoPropertyInfo очень похоже).

проблема состоит в том, что оценка эти .Expression очень хитра;-p

, Очевидно, Вы становитесь удачливыми, если это оказывается ConstantExpression - но в большинстве случаев это не; это могло быть ParameterExpression (в этом случае, необходимо будет знать фактическое значение параметра, которое Вы хотите оценить), или любая другая комбинация [1 115] с.

Во многих случаях, простое (возможно, ленивый) опция состоит в том, чтобы использовать .Compile(), чтобы заставить платформу.NET делать тяжелый подъем; можно затем оценить лямбду как введенный делегат (передающий в любых параметрах, которых лямбда требует). Это - не всегда опция, как бы то ни было.

, Чтобы показать, насколько сложный это; рассмотрите этот тривиальный пример (где я трудно кодировал на каждом шаге, вместо того, чтобы тестировать и т.д.):

using System;
using System.Linq.Expressions;
using System.Reflection;
class Foo
{
    public string Bar { get; set; }
}

static class Program
{
    static void Main()
    {
        Foo foo = new Foo {Bar = "abc"};
        Expression<Func<string>> func = () => foo.Bar;

        MemberExpression outerMember = (MemberExpression)func.Body;
        PropertyInfo outerProp = (PropertyInfo) outerMember.Member;
        MemberExpression innerMember = (MemberExpression)outerMember.Expression;
        FieldInfo innerField = (FieldInfo)innerMember.Member;
        ConstantExpression ce = (ConstantExpression) innerMember.Expression;
        object innerObj = ce.Value;
        object outerObj = innerField.GetValue(innerObj);
        string value = (string) outerProp.GetValue(outerObj, null);    
    }

}
40
ответ дан 27 November 2019 в 18:09
поделиться

спасибо так себе очень Marc Gravell выше. Я действительно ценил его справку.

Это складывается в моем случае. проблема может быть решена через:

object value = Expression.Lambda(expBody.Right).Compile().DynamicInvoke();

Еще раз спасибо Mark!

24
ответ дан 27 November 2019 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: