c# - Given a Member Access lambda expression, convert it to a specific string representation with full access path -


एक

  अभिव्यक्ति & lt; Func & lt; T, ऑब्जेक्ट & gt; & gt;  

(जैसे x => x.Prop1.SubProp), मैं एक स्ट्रिंग "Prop1.SubProp" बनाना चाहता हूं जितना गहन आवश्यक है।

इस मामले में एक एकल पहुंच (जैसे x => x.Prop1), मैं आसानी से इस के साथ कर सकता हूँ:

  सदस्य अभिव्यक्ति शरीर = (अभिव्यक्ति.बीडी। नोडप्रकार == अभिव्यक्ति टाइप करें। कनवर्ट)? (सदस्य अभिप्राय) ((UnaryExpression) अभिव्यक्ति। बॉडी) .अफ़र: (सदस्य अभिप्राय) अभिव्यक्ति। बॉडी; रिटर्न बॉडी.मंबर .नाम;  

हालांकि, अगर गहरी घोंसले के शिकार हैं, उदा। X => x.Prop1.SubProp1, यह केवल सबसे गहरा नेस्टेड नाम मिलता है, उदा। "प्रस्तुतिकरण 1 एसबप्रॉप 1" के बजाय "उपप्रॉप 1"

क्या लैम्ब्डा अभिव्यक्ति की पूरी संपत्ति पथ तक पहुंचने के लिए कोई रास्ता नहीं है?

  सार्वजनिक स्ट्रिंग GetPath & lt; T & gt; (अभिव्यक्ति & lt; Func & lt; T, ऑब्जेक्ट & gt; & gt; expr) {var stack = new stack & lt; string & gt; (); सदस्य स्विच (expr.Body.NodeType) {मामला अभिव्यक्ति प्रकार। कनवर्ट: केस अभिव्यक्ति प्रकार। कनवर्ट चेक: var ue = expr.Body UnaryExpression के रूप में; मुझे = ((ue! = नल)? Ue.Operand: null) सदस्य अभिव्यक्ति के रूप में; टूटना; डिफ़ॉल्ट: me = expr.Body सदस्य के रूप में अभिव्यक्ति; टूटना; } जबकि (मुझे! = नल) {stack.Push (me.Member.Name); मुझे = me.Expression सदस्य के रूप में अभिव्यक्ति; } वापसी स्ट्रिंग.जोइंड ("।", स्टैक। टू ऐरे ()); }  

Comments

Popular posts from this blog

windows - Heroku throws SQLITE3 Read only exception -

lex - Building a lexical Analyzer in Java -

python - rename keys in a dictionary -