2010-07-16 17 views
17

Şimdi bir süredir beni rahatsız eden bir sorun var ve cevabı bulamıyorum..NET 3.5'de bir Lambda Expression'da kullanılan özellik adını alın

Lambda İfadesi'nde başvurulan özelliklerin adını edinmem gerekiyor. Bir dize döndürecek bir yönteme lambda ifadesini veririm. Mesela ben varsa:

x => x.WeirdPropertyName 

sonra yöntem döndürür:

"WeirdPropertyName" 

Ben ifade ağaçları ile yapılabilir, ama cevap beni kurtulduğunu da okudum. herhangi bir yardım

+0

mülk veya mülk adı kendisinde değeri için soruyorsunuz:

İşte o cevaptan kodu? –

+0

Özellik adı –

+0

@Yuriy Bu makalenin –

cevap

27

gitmek:

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; 
} 
-4

Bir özelliğin dize adını almanın biliyorum tek yolu için

sayesinde yansıma yoluyla olmaktadır. İşte

6

Ben oldukça kapsamlı bir cevap here var.

x => x.WeirdPropertyName gibi ifadelerle uğraşmaya ek olarak, x => x.WeirdMember.WeirdPropertyName gibi "genişletilmiş" ifadelerle de ilgilenebilir.

// 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 
    ); 
} 
İlgili konular