[英]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
我不知道预期的类型(字符串,整数等),
我无法从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.PropertyType
或FieldInfo.FieldType
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.