2009-09-20 35 views
8

के साथ एक निजी विधि को ओवरराइड करना क्या .NET 3.5 में प्रतिबिंब का उपयोग करके एक निजी विधि को ओवरराइड करना संभव है?प्रतिबिंब

उत्तर

7

ठीक है, इसे virtual होना चाहिए ताकि इसे ओवरराइड किया जा सके (वर्ग से प्राप्त गतिशील प्रकार लिखकर), और आपके पास private virtual (यह कोई समझ नहीं आता)। आप शायद internal virtual को ओवरराइड कर सकते हैं, लेकिन मुझे संदेह है कि इससे सुरक्षा समस्याएं भी प्रभावित हो सकती हैं। तो आखिरकार, मैं नहीं कहूंगा।

1

प्रतिबिंब का उपयोग करके नहीं। आपको कुछ प्रकार के एओपी का उपयोग करने की आवश्यकता है।

5

अकेले प्रतिबिंब का उपयोग करके नहीं। शायद आप सबसे अच्छा कर सकते हैं प्रतिबिंब का उपयोग करना, Reflection.Emit या CodeDom के साथ संयुक्त को नए नामस्थान में कक्षा को डुप्लिकेट करने के लिए किया गया है। जब आप उस निजी विधि में आते हैं जिसे आप प्रतिस्थापित करना चाहते हैं, तो आप इसकी प्रतिलिपि नहीं बनाते हैं, आप अपना प्रतिस्थापन छोड़ देते हैं।

हालांकि, ऐसी तकनीकें हैं जो डेवलपर उपयोग कर सकती हैं जो इस तकनीक को बहुत कठिन बनाती हैं। कक्षा के कार्यान्वयन को कई निजी या आंतरिक वर्गों में तोड़ना एक ऐसा है।

नोट: कोडडॉम का उपयोग करके आपको स्मृति में ग्राफ बनाना होगा, इसे संकलित करना होगा, और उसके परिणामस्वरूप असेंबली लोड करें।

यह शायद इसके लायक होने की तुलना में बहुत अधिक परेशानी है।

ऐसा करने का दूसरा तरीका कक्षा को अलग करने के लिए Reflector का उपयोग करना होगा, कोड ले लें और विधि से प्रतिस्थापित करके अपनी कक्षा बनाएं। फिर से निपटने के लिए महत्वपूर्ण तकनीकी और कानूनी बाधाएं हैं। हालांकि आप अलग-अलग कोड से बहुत कुछ सीख सकते हैं।

+0

... या यदि कोड obfuscated है, तो आप कुछ भी नहीं सीख सकते हैं। –

+2

आप सीख सकते हैं कि कुछ कोड obfuscated है :-) –

1

Typemock Isolator ऐसा करने में सक्षम होना चाहिए, लेकिन ऐसा .NET प्रोफाइलर एपीआई के माध्यम से करता है (The Art of Unit Testing में रॉय ओशरोव के अनुसार)।