2011-11-10 11 views
7

क्या ExpressionHelper.GetExpressionText(LambdaExpression) पर .NET Framework विकल्प है? मुझे उन कुछ परियोजनाओं में इसकी आवश्यकता है जो System.Web.Mvc का संदर्भ नहीं दे सकते हैं।ExpressionHelper.GetExpressionText (LambdaExpression) वैकल्पिक

मैं समझता हूं कि GetExpressionText(LambdaExpression) विधि के अपने कार्यान्वयन को लिखने की संभावनाओं में से एक है लेकिन मैं इसे नहीं करना चाहता हूं। मेरा लक्ष्य पहले से ही मौजूदा .NET Framework कोड का पुन: उपयोग करना है।

string GetPropertyName(LambdaExpression expression) 
{ 
    var body = (MemberExpression)expression.Body; 
    return body.Member.Name; 
} 

यदि पारित में लैम्ब्डा नहीं MemberExpression है, यह एक अपवाद फेंक देते हैं (हालांकि आप एक अधिक वर्णनात्मक अपवाद चाहते हो सकता है):

+0

वास्तव में क्या आप की जरूरत है? क्या आप उस विधि का संदर्भ दिए बिना इसका वर्णन कर सकते हैं? – svick

+0

यह विधि लैम्बडा अभिव्यक्ति में निर्दिष्ट संपत्ति का नाम देती है। यदि आप एएसपी.नेट एमवीसी से परिचित हैं तो आपको इसे पहचानना चाहिए: 'HTML .extBoxFor (model => model.ID) '। विधि 'TextBoxFor' संपत्ति का नाम प्राप्त करने के लिए ExpressionHelper का उपयोग कर रहा है (यानी, "आईडी") और इस नाम के साथ नियंत्रण उत्पन्न करता है। मुझे एक ही कार्यक्षमता की आवश्यकता है: "x => x.SomeProperty" अभिव्यक्ति से मुझे परिणामस्वरूप "SomeProperty" प्राप्त करना होगा –

+1

कोई विकल्प मुझे पता नहीं है। FluentNHibernate उदाहरण के लिए यह भी अपना खुद का कार्यान्वित किया। – Firo

उत्तर

8

कि विधि को लागू करने अपने आप को काफी आसान है।

यदि आप विधि को सीधे GetPropertyName(x => x.ID) पर कॉल करना चाहते हैं, तो आपको किसी भी तरह से x टाइप करना होगा। एक तरीका यह एक प्रकार पैरामीटर है:

string GetPropertyName<T>(Expression<Func<T, object>> expression) 
{ 
    var body = (MemberExpression)expression.Body; 
    return body.Member.Name; 
} 

लेकिन इसका मतलब यह होगा कि आप इसे स्पष्ट रूप से निर्दिष्ट करने के लिए है:

GetPropertyName<Foo>(f => f.Id) 
+0

मुझे खेद है, लेकिन क्या आपने मेरा प्रश्न सावधानीपूर्वक पढ़ा? जैसा कि मैंने लिखा था "मैं समझता हूं कि संभावनाओं में से एक मेरा अपना कार्यान्वयन लिखना है ... लेकिन मैं इसे नहीं करना चाहता हूं"। मुझे पता है कि इस तरह के तरीकों को कैसे लिखना है, सबसे बुरी स्थिति में मैं Google का उपयोग करता हूं। अब तक @ फ़िरो ने अपनी टिप्पणी –

+0

में सबसे अच्छा जवाब दिया है और आप इसे अपने आप क्यों लागू नहीं करना चाहते हैं? क्या आपके पास इसके लिए कोई कारण है? – svick

+0

क्योंकि मैं पहले से ही मौजूदा कार्यक्षमता का पुन: उपयोग करना चाहता हूं। और, ज़ाहिर है, इस कोड का समर्थन मेरी समस्या नहीं होगी। –

संबंधित मुद्दे