2010-07-16 14 views
17

में एक लैम्ब्डा अभिव्यक्ति में प्रयुक्त संपत्ति का नाम प्राप्त करें मुझे एक समस्या है जो मुझे कुछ समय से परेशान कर रही है और मुझे जवाब नहीं मिल रहा है।.NET 3.5

मुझे लैम्ब्डा अभिव्यक्ति में संदर्भित संपत्ति का नाम प्राप्त करने की आवश्यकता है। मैं लैम्ब्डा अभिव्यक्ति को एक विधि में प्रदान करूंगा जो एक स्ट्रिंग लौटाएगा। उदाहरण के लिए अगर मेरे पास है:

x => x.WeirdPropertyName 

तो विधि वापसी होगी:

"WeirdPropertyName" 

मैंने पढ़ा है कि यह अभिव्यक्ति के पेड़ के साथ किया जा सकता है, लेकिन इस सवाल का जवाब मुझे नहीं मिल पाया है।

किसी भी मदद

+0

आप संपत्ति या संपत्ति नाम अपने आप में मूल्य के लिए पूछ रहे हैं:

यहाँ है कि इसका जवाब से कोड है? –

+0

संपत्ति का नाम खुद –

+0

@Yuriy मुझे नहीं लगता कि यह लेख मेरे प्रश्न –

उत्तर

27

ये रहा:

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

एक ही रास्ता मैं एक संपत्ति की स्ट्रिंग नाम हो रही है के बारे में पता करने के लिए धन्यवाद प्रतिबिंब के माध्यम से है।

6

मैं एक बहुत व्यापक जवाब 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 
    ); 
}