从MemberExpression获取属性值

Chu*_*way 2 c# expression

我正在尝试从的实例检索属性的值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);
}
Run Code Online (Sandbox Code Playgroud)

根据我采用的方法,有两个问题:我不知道预期的类型(字符串,整数等),和/或我无法从中访问实例MemberExpression

我正在向T-SQL转换器编写一个小的lambda表达式。例如,(u)=> u.FirstName == u.LastName;将转换为FirstName = 'chuck'。我快要工作了!

更新

我尝试了以下代码:

...  

var propertyInfo = node.Member as PropertyInfo;

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

...
Run Code Online (Sandbox Code Playgroud)

这没用。我收到以下错误:

System.Reflection.TargetException : Object does not match target type.
Run Code Online (Sandbox Code Playgroud)

更新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();
    }
Run Code Online (Sandbox Code Playgroud)

但是我不知道T在编译时。

Jon*_*eet 5

我不知道预期的类型(字符串,整数等),

使用 Expression.Type

我无法从MemberExpression访问实例

使用MemberExpression.Expression-显然,这是另一种表达方式,因为您可能具有:

foo.GetBar(20).ToString().Length
Run Code Online (Sandbox Code Playgroud)

在这种情况下,该Length属性将为a MemberExpression,但该Expression属性将为MethodCallExpressionfor ToString