我正在尝试从的实例检索属性的值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在编译时。
我不知道预期的类型(字符串,整数等),
我无法从MemberExpression访问实例
使用MemberExpression.Expression-显然,这是另一种表达方式,因为您可能具有:
foo.GetBar(20).ToString().Length
Run Code Online (Sandbox Code Playgroud)
在这种情况下,该Length属性将为a MemberExpression,但该Expression属性将为MethodCallExpressionfor ToString。
| 归档时间: |
|
| 查看次数: |
5031 次 |
| 最近记录: |