我有一個問題,一直嘮叨我一段時間,我無法找到答案。獲取.NET 3.5中的Lambda表達式中使用的屬性名稱
我需要獲取在Lambda表達式中引用的屬性的名稱。我會將lambda表達式提供給將返回字符串的方法。例如,如果我有:
x => x.WeirdPropertyName
那麼該方法將返回:
"WeirdPropertyName"
我已閱讀,它可以用表達式樹來完成,但得到的答覆一直困擾我。
感謝所有幫助
我有一個問題,一直嘮叨我一段時間,我無法找到答案。獲取.NET 3.5中的Lambda表達式中使用的屬性名稱
我需要獲取在Lambda表達式中引用的屬性的名稱。我會將lambda表達式提供給將返回字符串的方法。例如,如果我有:
x => x.WeirdPropertyName
那麼該方法將返回:
"WeirdPropertyName"
我已閱讀,它可以用表達式樹來完成,但得到的答覆一直困擾我。
感謝所有幫助
在這裏你去:
string GetPropertyName<T>(Expression<Func<T>> property)
{
var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo;
if (propertyInfo == null)
{
throw new ArgumentException("The lambda expression 'property' should point to a valid Property");
}
return propertyInfo.Name;
}
我知道得到一個屬性的字符串名稱的唯一方法是通過反射。
我有一個非常全面的答案here。
除了處理像x => x.WeirdPropertyName
這樣的表達式之外,它還可以處理「擴展」表達式,例如x => x.WeirdMember.WeirdPropertyName
。
下面是這個問題的答案代碼:
// code adjusted to prevent horizontal overflow
static string GetFullPropertyName<T, TProperty>
(Expression<Func<T, TProperty>> exp)
{
MemberExpression memberExp;
if (!TryFindMemberExpression(exp.Body, out memberExp))
return string.Empty;
var memberNames = new Stack<string>();
do
{
memberNames.Push(memberExp.Member.Name);
}
while (TryFindMemberExpression(memberExp.Expression, out memberExp));
return string.Join(".", memberNames.ToArray());
}
// code adjusted to prevent horizontal overflow
private static bool TryFindMemberExpression
(Expression exp, out MemberExpression memberExp)
{
memberExp = exp as MemberExpression;
if (memberExp != null)
{
// heyo! that was easy enough
return true;
}
// if the compiler created an automatic conversion,
// it'll look something like...
// obj => Convert(obj.Property) [e.g., int -> object]
// OR:
// obj => ConvertChecked(obj.Property) [e.g., int -> long]
// ...which are the cases checked in IsConversion
if (IsConversion(exp) && exp is UnaryExpression)
{
memberExp = ((UnaryExpression)exp).Operand as MemberExpression;
if (memberExp != null)
{
return true;
}
}
return false;
}
private static bool IsConversion(Expression exp)
{
return (
exp.NodeType == ExpressionType.Convert ||
exp.NodeType == ExpressionType.ConvertChecked
);
}
你要求的屬性或屬性名稱本身的價值? – 2010-07-16 23:56:48
屬性名稱本身 – 2010-07-17 00:03:59
@Yuriy我不明白那篇文章與我的問題有何關係 – 2010-07-17 00:05:05