2010-04-02 10 views
34

उदाहरण के लिए,प्रतिबिंब का उपयोग कर परिवर्तनीय नाम कैसे प्राप्त करें?

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(GetVariableName(someVar)); 
} 

इस कार्यक्रम का उत्पादन किया जाना चाहिए:

someVar 

मैं कैसे प्राप्त कर सकते हैं प्रतिबिंब का उपयोग है?

+1

@helen मेरा प्रश्न बहुत आसान है, क्योंकि एक प्रश्न के बिखरने के विरोध में वह अभी भी अलग है। –

+0

इसके पीछे तर्क क्या हो सकता है? – Dested

उत्तर

57

प्रतिबिंब के साथ ऐसा करना संभव नहीं है, क्योंकि चर के बाद एक बार आईएल में संकलित नहीं किया जाएगा। हालांकि, अगर आप अभिव्यक्ति के पेड़ का उपयोग करें और एक बंद करने के लिए चर को बढ़ावा देने के कर सकते हैं:

static string GetVariableName<T>(Expression<Func<T>> expr) 
{ 
    var body = (MemberExpression)expr.Body; 

    return body.Member.Name; 
} 

आप इस प्रकार इस विधि का उपयोग कर सकते हैं:

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(GetVariableName(() => someVar)); 
} 

ध्यान दें कि यह बहुत धीमी है, तो उसका उपयोग नहीं करते अपने आवेदन के महत्वपूर्ण महत्वपूर्ण प्रदर्शन में। हर बार जब यह कोड चलता है, तो कई ऑब्जेक्ट बनाए जाते हैं (जो जीसी दबाव का कारण बनता है) और कवर के तहत कई गैर-इनलाइन योग्य तरीकों को बुलाया जाता है और कुछ भारी प्रतिबिंब का उपयोग किया जाता है।

अधिक संपूर्ण उदाहरण के लिए, here देखें।

अद्यतन

के साथ सी # 6.0, nameof कीवर्ड भाषा है, जो हमें करने की अनुमति देता में जोड़ा जाता है निम्नलिखित:

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(nameof(someVar)); 
} 

यह स्पष्ट रूप से और अधिक सुविधाजनक है और एक ही लागत है लगातार स्ट्रिंग अक्षर के रूप में स्ट्रिंग को परिभाषित किया है।

+0

मुझे यकीन नहीं है कि यह प्रदर्शन के संदर्भ में वास्तव में बुरा है। अभिव्यक्ति के पेड़ों को संकलित करने में प्रदर्शन समस्याएं क्या हो सकती हैं, लेकिन आप इसे यहां नहीं करते हैं। –

+0

अपने स्वयं के लिए देखो जहां 'GetVariableName (() => someVar)' परावर्तक का उपयोग करने के लिए संकलित हो जाता है। हर बार जब यह कोड चलता है, तो कई ऑब्जेक्ट्स बनाए जाते हैं और कवर के तहत कई गैर-इनलाइन योग्य तरीकों को बुलाया जाता है और कुछ भारी प्रतिबिंब का उपयोग किया जाता है। अभिव्यक्ति पेड़ का प्रयोग मुक्त नहीं है। – Steven

+0

हाँ, आप सही हैं। इसमें प्रदर्शन लागत है। लेकिन यह "अपेक्षाकृत" अभिव्यक्ति वृक्ष संकलन करने की तुलना में छोटा है। –

0

आप प्रतिबिंब का उपयोग नहीं कर सकते हैं। GetVariableName संख्या 3 पारित किया गया है, एक चर नहीं। आप आईएल के कोड निरीक्षण के माध्यम से ऐसा कर सकते हैं, लेकिन शायद यह बहुत मुश्किल टोकरी में है।

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