2010-01-29 16 views
8

मेरे पास इस प्रकार की अभिव्यक्ति है:अभिव्यक्ति वृक्ष से पैरामीटर नाम कैसे प्राप्त करें?

Expression<Action<T>> expression 

मैं इस अभिव्यक्ति से पैरामीटर नाम कैसे प्राप्त करूं (वैकल्पिक: और मान)?

उदाहरण:

o => o.Method("value1", 2, new Object()); 

नाम str_par1 हो सकता है, int_par2, obj_par3

+1

मूल्यों से आपका क्या मतलब है? – jason

+0

मानों से मेरा मतलब था o => o.Method ("value") // विधि (स्ट्रिंग एस) नाम – Omu

उत्तर

16
Expression<Action<Thing>> exp = o => o.Method(1, 2, 3); 
var methodInfo = ((MethodCallExpression)exp.Body).Method; 
var names = methodInfo.GetParameters().Select(pi => pi.Name); 
4

आप Parameters संपत्ति से पैरामीटर नाम मिल सकता है।

उदाहरण के लिए:

Expression<Action<string, int>> expr = (a, b) => (a + b).ToString(); 
var names = expr.Parameters.Select(p => p.Name); //Names contains "a" and "b" 

दूसरे भाग के लिए, लैम्ब्डा भाव सिर्फ uncompiled कार्य हैं।
उनके पैरामीटर में मान नहीं हैं जब तक आप अभिव्यक्ति को संकलित नहीं करते और प्रतिनिधि को कुछ मानों के साथ कॉल करते हैं।

यदि आप लैम्ब्डा अभिव्यक्ति i => i.ToString() लेते हैं, तो कोई पैरामीटर मान कहां है?

+1

है, मैं वास्तव में विधि o => o.Method (par1, par2, par3) के पैरामीटर के नाम चाहता था) – Omu

2

मैं इस अभिव्यक्ति से पैरामीटर नाम कैसे प्राप्त करूं?

expression.Parameters[0].Name 

अपने भविष्य के संदर्भ के लिए, दस्तावेज़ीकरण यहाँ है:

http://msdn.microsoft.com/en-us/library/bb359453.aspx

(वैकल्पिक: और मान)?

इससे मुझे कोई समझ नहीं आती है। क्या आप समझा सकते हैं कि "और मूल्य" से आपका क्या मतलब है?

+0

मूल्यों से मेरा मतलब था o => o.Method ("value") // विधि (स्ट्रिंग एस) नाम – Omu

+0

है, मैं वास्तव में विधि के पैरामीटर के नाम चाहता था o => o.Method (par1, par2, Par3) – Omu

3

Method के लिए पैरामीटर? अभिव्यक्ति से MethodInfo प्राप्त करें (अनुमान पर, MethodCallExpression.Method), और उसके बाद पैरामीटर प्राप्त करने के लिए MethodBase.GetParameters() का उपयोग करें। (ParameterInfo में Name सहित कई उपयोगी गुण हैं)।

2

मैं वास्तव में विधि ओ के मापदंडों के नाम => o.Method (par1, par2, Par3)

चाहता था आप कुछ विश्वास है कि हम मानसिक कर रहे हैं, शायद है ।

वैसे भी, आगे बढ़ना।

मैं वास्तव में विधि o => o के पैरामीटर के नाम चाहता था।विधि (par1, par2, Par3)

पहले औपचारिक पैरामीटर का नाम है:

(expression.Body as MethodCallExpression).Method.GetParameters()[0].Name 

अभिव्यक्ति जो पहला तर्क

(expression.Body as MethodCallExpression).Arguments[0] 

अपने भविष्य के संदर्भ के लिए है, दस्तावेज यहां है:

http://msdn.microsoft.com/en-us/library/system.linq.expressions.methodcallexpression.arguments.aspx

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