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)
,但仍然失敗我哪裡錯了?
您需要一個單獨的行來提取輸入表達式為一元表達式的Member。
剛剛從VB.Net轉換了這個,所以可能稍微關閉 - 如果我需要進行任何小的調整,請告訴我:
public string GetCorrectPropertyName<T>(Expression<Func<T, Object>> expression)
{
if (expression.Body is MemberExpression) {
return ((MemberExpression)expression.Body).Member.Name;
}
else {
var op = ((UnaryExpression)expression.Body).Operand;
return ((MemberExpression)op).Member.Name;
}
}
VB版本是:
Public Shared Function GetCorrectPropertyName(Of T) _
(ByVal expression As Expression(Of Func(Of T, Object))) As String
If TypeOf expression.Body Is MemberExpression Then
Return DirectCast(expression.Body, MemberExpression).Member.Name
Else
Dim op = (CType(expression.Body, UnaryExpression).Operand)
Return DirectCast(op, MemberExpression).Member.Name
End If
End Function
請注意,輸入表達式不會返回字符串 - 這會限制您只讀取返回字符串的屬性。
這顯然與裝箱/拆箱有關。返回需要裝箱的值類型的Lambda表達式將表示為UnaryExpressions,而返回引用類型的表達式將表示為MemberExpressions。