繁体   English   中英

从MemberExpression获取属性值

[英]Get property value from MemberExpression

我正在尝试从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);
}

根据我采用的方法,有两个问题:我不知道预期的类型(字符串,整数等),和/或我无法从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);
}

...

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

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

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

使用Expression.Type

我无法从MemberExpression访问实例

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

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

在这种情况下, Length属性将是MemberExpression ,但是Expression属性将为ToString提供MethodCallExpression

我无法从MemberExpression访问实例。

在您的示例u => u.FirstName == "chuck" ,没有要获取其FirstName属性的实例。

我认为您实际上需要属性的名称-这是node.Member.Name (在您的示例中为“ FirstName”)。 请注意,这适用于所有MemberInfo ,而不仅适用于PropertyInfo ,因此字段也将适用。 (您可能仍要进行测试,因为事件也是成员表达式,但在这里没有意义。)

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

预期的类型为PropertyInfo.PropertyTypeFieldInfo.FieldType

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM