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

Учитывая выражение, которое указывает на свойство в графе объектов, я хочу получить экземпляр, который владеет скручиванием жгутов свойства тот график. Я боролся. Текущий код просто дает мне Систему. InvalidOperationException: Параметр Лямбды не в объеме

    [Test]
    public void TestExpression()
    {
        var person = new Person {Address = {Street = "Bank Street"}, Name = "Joe"};

        Expression<Func<Person, object>> exp = p => p.Address.Street;
        Assert.AreEqual("Bank Street", exp.Compile().Invoke(person));

        var owner = GetPropertyOwner(person, exp);
        Assert.AreEqual(owner, person.Address);
    }

    private object GetPropertyOwner<T>(T root, Expression<Func<T, object>> exp)
    {
        if (exp.Body is MemberExpression)
        {
            var member = exp.Body as MemberExpression;
            if (member.Expression is MemberExpression)
            {
                var parentMember = member.Expression as MemberExpression;
                //parent member will be {p.Address}
                //Now I'm trying to reconstruct an expression that I can combile
                var parameterExpression = System.Linq.Expressions.Expression.Parameter(typeof(T), "p");
                var lambdaExpression = System.Linq.Expressions.Expression.Lambda(parentMember, parameterExpression);
                //Next Linethrows  System.InvalidOperationException : Lambda Parameter not in scope
                var found = lambdaExpression.Compile().DynamicInvoke(person);
                return found;
            }
        }

        return new object();
    }
1
задан Max 16 July 2010 в 11:57
поделиться

1 ответ

Объекты ParameterExpression сравниваются по равенству ссылок, а не по имени, поэтому параметр «p», который принимает lambdaExpression, не совпадает с параметром, используемым в parentMember. Вам нужно будет использовать тот же экземпляр ParameterExpression при построении новой лямбды. Попробуйте:

var parameterExpression = exp.Parameters[0];
2
ответ дан 2 September 2019 в 23:01
поделиться
Другие вопросы по тегам:

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