2016-08-25 7 views
5

तक पहुंचने पर मैंने हाल ही में सी # प्रश्नों के साथ एक साक्षात्कार किया था। उनमें से एक मुझे जवाब नहीं मिल रहा है।एक साक्षात्कार पहेली: एक निजी डेटा सदस्य

मैं एक वर्ग दिया गया था, इस तरह दिखता है:

public class Stick 
{ 
    private int m_iLength; 
    public int Length 
    { 
     get 
     { 
      return m_iLength; 
     } 
     set 
     { 
      if (value > 0) 
      { 
       m_iLength = value; 
      } 
     } 
    } 
} 

इसके अलावा, एक मुख्य वर्ग में दिया गया था

static void Main(string[] args) 
{ 
    Stick stick = new Stick(); 
} 

कार्य मुख्य करने के लिए कोड जोड़ने के लिए है कि में m_iLength कारण होगा था चिपकने वाला वर्ग नकारात्मक होना चाहिए (और यह जोर दिया गया था कि यह किया जा सकता है)।

मुझे कुछ याद आ रहा है। डेटा सदस्य निजी है, और जहां तक ​​मुझे पता है कि प्राप्त करें और सेट फ़ंक्शन टाइप int के लिए मूल्य से हैं, इसलिए मुझे नहीं पता कि यह कैसे किया जा सकता है।

+3

प्रतिबिंब शायद? – slawekwin

+5

उदाहरण: http://stackoverflow.com/questions/10862747/access-private-fields – bobah75

+1

@ सीसे में सी # आप क्लास सदस्यों को ओवरराइड नहीं कर सकते हैं जब तक उन्हें "आभासी" घोषित नहीं किया जाता है (उदाहरण के लिए जावा के विपरीत)। प्रतिबिंब एकमात्र तरीका है जिसे मैं देख सकता हूं (अंतर्निहित आईएल को संशोधित करने के लिए, या स्मृति बैकिंग iLength को संशोधित करने के लिए असुरक्षित कोड का उपयोग करना - यह भी सुनिश्चित नहीं है कि वह अंतिम संभव है या नहीं!) –

उत्तर

4

प्रतिबिंब हमेशा सबसे सीधा है:

var type = typeof(Stick); 
var field = type.GetField("m_iLength", BindingFlags.NonPublic |BindingFlags.GetField | BindingFlags.Instance); 
field.SetValue(stick, -1); 
Console.WriteLine(stick.Length); 

स्पष्टीकरण:

पहली पंक्ति Stick के लिए Type वस्तु हो जाता है, तो हम बाद में निजी क्षेत्रों प्राप्त कर सकते हैं।

दूसरी पंक्ति उस फ़ील्ड को प्राप्त करती है जिसे हम इसके नाम से सेट करना चाहते हैं। ध्यान दें कि बाध्यकारी झंडे आवश्यक हैं या fieldnull होगा।

और तीसरी पंक्ति क्षेत्र को नकारात्मक मान देती है।

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