从属性名称获取属性lambda(其中属性类型可以为空)

时间:2009-11-26 11:28:02

标签: linq lambda

您好我基本上需要一个带有以下签名的功能

Expression<Func<T, object>> GetPropertyLambda(string propertyName)

我做了几次尝试,但是当房产可以为空时出现问题 它就像这样

ParameterExpression param = Expression.Parameter(typeof(T), "arg");

Expression member = Expression.Property(param, propertyName);

//this next section does conver if the type is wrong however
// when we get to Expression.Lambda it throws
Type typeIfNullable = Nullable.GetUnderlyingType(member.Type);
if (typeIfNullable != null)
{
    member = Expression.Convert(member, typeIfNullable);
}                       
return Expression.Lambda<Func<T, object>>(member, param);

例外是

  

类型的表达   'System.Decimal'   不能用于返回类型   'System.Object的'

我真的会想到一些想法以及为什么这不能按预期工作

由于

1 个答案:

答案 0 :(得分:8)

实际上我认为问题与Nullable类型无关,而是与值类型有关。尝试使用类型为decimal(不是Nullable<decimal>)的属性的方法:它会以同样的方式失败。

查看如何为值和引用类型生成表达式树(例如,使用LinqPad)

  • Expression<Func<T, object>> lambda = x => x.AString;(参考类型)
    =&GT;正文是MemberExpression

  • Expression<Func<T, object>> lambda = x => x.ADecimal;(值类型)
    =&GT;正文是UnaryExpression NodeType = ConvertType = typeof(object),其OperandMemberExpression

我稍微修改了你的方法以考虑到这一点,它似乎工作正常:

ParameterExpression param = Expression.Parameter(typeof(T), "arg");

Expression member = Expression.Property(param, propertyName);

if (member.Type.IsValueType)
{
  member = Expression.Convert(member, typeof(object));
}

return Expression.Lambda<Func<T, object>>(member, param);