4

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

例如

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

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

发生了什么,propertyLambda 看起来不像Convert(o.MyBooleanProperty)o.MyBooleanProperty所期望的那样。

4

1 回答 1

3

Convert添加,因为o.MyBooleanProperty是 a bool,但结果必须是一个对象。如果你在源对象类型和结果类型中都使你的方法通用,那么就不会有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)
于 2012-06-26T00:12:21.787 回答