Получить значение свойства из MemberExpression - PullRequest
2 голосов
/ 20 марта 2012

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

Вот что у меня есть:

protected override void VisitMember(Context context, MemberExpression node)
{              
    var propertyInfo = node.Member as PropertyInfo;
    if(propertyInfo != null)
    {
       var v = propertyInfo.GetValue(node.Member , null);
       val = Convert.ToString(v);
    }
    context.State.Append(val);
}

В зависимости от выбранного мной подхода есть две проблемы: я не знаю ожидаемый тип (string, int и т. Д.)..) и / или я не смог получить доступ к экземпляру из MemberExpression.

Я пишу небольшие лямбда-выражения в T-SQL конвертер.Например, (u)=> u.FirstName == u.LastName; будет преобразовано в FirstName = 'chuck'.У меня почти все заработало!

обновление

Я попробовал следующий код:

...  

var propertyInfo = node.Member as PropertyInfo;

if(propertyInfo != null)
{
   var o = propertyInfo.GetValue(node.Expression, null);
}

...

Не сработало.Я получаю следующую ошибку:

System.Reflection.TargetException : Object does not match target type.

обновление 2

Это то, что я пытаюсь сделать:

    public static Func<T, object> GetValueGetter<T>(this PropertyInfo propertyInfo)
    {
        if (typeof(T) != propertyInfo.DeclaringType)
        {
            throw new ArgumentException();
        }

        var instance = Expression.Parameter(propertyInfo.DeclaringType, "i");
        var property = Expression.Property(instance, propertyInfo);
        var convert = Expression.TypeAs(property, typeof(object));
        return (Func<T, object>)Expression.Lambda(convert, instance).Compile();
    }

Но я делаюне знаю T во время компиляции.

Ответы [ 2 ]

4 голосов
/ 20 марта 2012

Я не знаю ожидаемый тип (string, int и т.д ...),

Использование Expression.Type

Мне не удалось получить доступ к экземпляру из MemberExpression

Используйте MemberExpression.Expression - очевидно, это другое выражение, потому что вы можете иметь:

foo.GetBar(20).ToString().Length

в этом случае свойство Length будет MemberExpression, но свойство Expression даст MethodCallExpression для ToString.

0 голосов
/ 20 марта 2012

Мне не удалось получить доступ к экземпляру из выражения MemberExpression.

В вашем примере u => u.FirstName == "chuck" нет экземпляра, для которого можно было бы получить свойство FirstName.

Я думаю, вы на самом деле хотите получить имя свойства, которое равно node.Member.Name (в вашем примере это "FirstName").Обратите внимание, что это работает для всех MemberInfo, а не только для PropertyInfo, поэтому поля также будут работать.(Вы можете захотеть проверить в любом случае, потому что События также являются выражениями-членами, но здесь не имеют смысла.)

Я не знаю ожидаемый тип (string, int и т. Д ...),

Ожидаемый тип: PropertyInfo.PropertyType или FieldInfo.FieldType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...