属性Lambda表达式获得额外的转换(p => p.Property)

时间:2012-06-25 23:27:40

标签: c# lambda

我有一个问题,在某些情况下(似乎是属性类型为bool),lambda表达式用于引用属性。我用它来得名;问题是有时候表达式被修改为有一个额外的Convert()函数。

e.g。

GetPropertyName<TSource>(Expression<Func<TSource, object>> propertyLambda) {...}

var str = GetPropertyName<MyObject>(o=>o.MyBooleanProperty);

发生了什么事情,propertyLambda看起来像Convert(o.MyBooleanProperty)而不是o.MyBooleanProperty,我期待。

1 个答案:

答案 0 :(得分:3)

添加了Convert,因为o.MyBooleanPropertybool,但结果必须是对象。如果你的方法在源对象类型和结果类型中都是通用的,那么就没有Convert

GetPropertyName<TSource, TResult>(Expression<Func<TSource, TResult>> propertyLambda)

不幸的是,这意味着您必须明确指定TResult

GetPropertyName<MyObject, bool>(o => o.MyBooleanProperty)

如果您不想这样做,则必须找到推断MyObject的方法,或者避免需要它。

例如,如果当前对象为MyObject(并且您使用的是实例方法),则可以将代码更改为Func<TResult>

GetPropertyName(() => this.MyBooleanProperty)

或者您可以包含另一个TSource类型的参数,它可以帮助您推断出类型:

GetPropertyName(myObject, o => o.MyBooleanProperty)