Я пытаюсь получить значение свойства из экземпляра 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
во время компиляции.