我在C#中创建了一个方法,用于获取方法名称
public string GetCorrectPropertyName<T>(Expression<Func<T, string>> expression)
{
return ((MemberExpression)expression.Body).Member.Name; // Failure Point
}
并将其称为
string lcl_name = false;
public string Name
{
get { return lcl_name ; }
set
{
lcl_name = value;
OnPropertyChanged(GetCorrectPropertyName<ThisClassName>(x => x.Name));
}
}
如果属性是字符串,则代码可以正常运行,但对于所有其他类型,则会出现以下异常:
无法将类型为“System.Linq.Expressions.UnaryExpression”的对象强制转换为类型“System.Linq.Expressions.MemberExpression”。
- 我已将方法签名中的字符串更改为对象,但它仍然失败了。
- 我将调用从
x => x.PropertyName
更改为x => Convert.ToString(x.PropertyName)
,但它仍然失败了。
我错在哪里了?
Expression<Func<T>>
。这会将调用站点语法更改为GetCorrectPropertyName(() => this.Name)
,在我看来,这既更易于输入(无需提供泛型类型参数),也更易于阅读(this.Name
非常明确地传达了意图)。 - Jon