Я попробовал несколько решений, но его единственный, который действительно работал для меня во всех браузерах
let newTab = window.open();
newTab.location.href = url;
[обновленный для ясности]
Сначала; бросьте Expression
к MemberExpression
.
А MemberExpression
имеет две вещи интереса:
PropertyInfo
/ FieldInfo
участнику т.е. если можно оценить .Expression
к "obj", и эти .Member
, FieldInfo
, затем можно получить фактическое значение через .GetValue(obj)
на FieldInfo
(и PropertyInfo
очень похоже).
проблема состоит в том, что оценка эти .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);
}
}
спасибо так себе очень Marc Gravell выше. Я действительно ценил его справку.
Это складывается в моем случае. проблема может быть решена через:
object value = Expression.Lambda(expBody.Right).Compile().DynamicInvoke();
Еще раз спасибо Mark!