2010-11-11 15 views
14

this में यह निर्धारित करने के लिए सबसे तेज़ तरीका है कि किसी संपत्ति में दी गई विशेषता है, उपयोगकर्ता Darin Dimitrov सकारात्मक है कि अभिव्यक्ति पेड़ प्रतिबिंब से सुरक्षित हैं। क्या यह सच है, और यदि हां, तो यह सच क्यों है?अभिव्यक्ति पेड़ प्रतिबिंब से सुरक्षित क्यों हैं?

उत्तर

13

क्योंकि जब आप अपने क्षेत्र की खोज करते हैं (जैसा कि उस प्रश्न में) आप स्ट्रिंग प्रस्तुति "Id" का उपयोग करते हैं। एक बार यह बदल जाने के बाद आपका प्रतिबिंब गिर जाएगा।

Expression<Func<Program, int>> expression = p => p.Id; 

आप देख:

क्या डैरिन पता चलता है स्थिर टाइपिंग है? यह दिलचस्प है, लेकिन सी # 4.0 कंपाइलर की प्रसिद्ध विशेषता नहीं है: स्वचालित रूप से लैम्ब्डा अभिव्यक्ति से अभिव्यक्ति वृक्ष का निर्माण करें और इसे Expression<T> पर डालें। तो बाद में आप इसे पार कर सकते हैं और के MemberInfo प्राप्त कर सकते हैं। लेकिन यह प्रतिबिंब के रूप में सार्वभौमिक नहीं है क्योंकि आप string द्वारा खोज नहीं कर सकते हैं।

+6

और यह स्वचालित रीफैक्टरिंग टूल के साथ बेहतर काम करता है क्योंकि उन्हें पता है कि यह एक निश्चित संपत्ति को संदर्भित करता है और यह एक अपारदर्शी स्ट्रिंग नहीं है। – CodesInChaos

+0

क्या गति में कोई अंतर है? – hkon

+0

@ हकॉन कुछ। आपको 'MemberInfo' – Andrey

1

.NET के मेरे सीमित ज्ञान से अभिव्यक्ति वृक्ष का तरीका प्रकार की जांच करना प्रतीत होता है।

5

जैसा सवाल यह बताया गया है कि क्यों अभिव्यक्ति पेड़ सुरक्षित हैं तो प्रतिबिंब।

उत्तर यह है कि वे प्रतिबिंब का उपयोग कर दोनों हैं।

स्पष्टीकरण के लिए संपादित करें - MemberInfo.GetCustomAttributes एक प्रतिबिंब कॉल है।

http://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.getcustomattributes(VS.71).aspx

+1

सुरक्षा में कुछ अंतर है, इसलिए आप गलत हैं। – Andrey

+0

प्रतिबिंब में कॉल करने के लिए बिंदु प्राप्त करना टाइप सुरक्षित है, और यह एक साफ चाल है। हालांकि दोनों मामलों में अंतिम परिणाम सिस्टम में एक प्रतिबिंब कॉल है। Reflection.MemberInfo.GetCustomAttributes – asawyer

+0

सवाल यह है कि वे अलग कैसे हैं, वे समान कैसे हैं। – Andrey

0

हम जब उदाहरण के लिए गुण का नाम बदलने को तोड़ने प्रकार सुरक्षा और कोड के बारे में बात कर रहे हैं, अभिव्यक्ति पेड़ "लाभ" अब नकार दिया गया हम() nameof की तरह नए सी # विशेषताएं हैं कि:

अभिव्यक्ति पेड़ रास्ता (nameof से पहले बेहतर() था): नाम से

Expression<Func<YourClass, int>> expression = p => p.Id; 
var memberExpression = (MemberExpression)expression.Body; 
var property = ((PropertyInfo)memberExpression.Member); 

getProperty (पहले nameof (बुरा था)):

var property = typeof(YourClass).GetProperty(nameof(YourClass.Id)); 

getProperty में स्ट्रिंग इनपुट के बाद से यह "आईडी" के लिए hardcoded किया गया था, सुरक्षित नहीं था, और जब आप ईद संपत्ति का नाम बदला, अपने कोड कार्यावधि में तोड़ अगर आप इस स्ट्रिंग में अच्छी तरह से बदलने के लिए याद नहीं था होता।

इसने अभिव्यक्ति के पेड़ को सुरक्षित बना दिया, क्योंकि आपने संपत्ति के वास्तविक नाम का उपयोग किया था।

लेकिन अब हमारे पास नाम है(), स्ट्रिंग का उपयोग वास्तव में संकलन समय पर संपत्ति का नाम है, और यदि आप संपत्ति का नाम बदलते हैं, और आप/आपका आईडीई उपरोक्त स्निपेट में इसका नाम बदलने के लिए "भूल जाता है" , संकलन समय पर कोड टूट जाएगा।

तो अब पुरानी "खराब रास्ता" मेरी राय में अधिक संक्षिप्त है और संभवतः आपको कम से कम बेहतर प्रदर्शन करता है, क्योंकि आपको अतिरिक्त कास्टिंग की आवश्यकता नहीं है।

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