2008-11-06 12 views
13

हम माइक्रोसॉफ्ट का उपयोग कर रहे हैं। प्रैक्टिस। कॉम्पोजिटयूआई.इवेंट ब्रोकर हमारे आवेदन में ईवेंट सदस्यता और प्रकाशन को संभालने के लिए। एक ही विषय नाम के साथमैं रनटाइम पर किसी विधि में विशेषताओं को कैसे जोड़ूं?

[EventPublication("example", PublicationScope.Global)] 
public event EventHandler Example; 

तो आप अपने हैंडलर के लिए एक और विशेषता जोड़ने,, इस तरह:: तरीका है कि काम करता है कि आप अपने घटना के लिए एक विशेषता जोड़ने के लिए, एक विषय का नाम निर्दिष्ट, इस तरह है

[EventSubscription("example", ThreadOption.Publisher)] 
public void OnExample(object sender, EventArgs e) 
{ 
    ... 
} 

फिर आप अपनी ऑब्जेक्ट्स को इवेंट इंस्पेक्टर को पास करते हैं जो सबकुछ से मेल खाता है।

हमें इसे डीबग करने की आवश्यकता है, इसलिए हम एक डीबग क्लास बनाने की कोशिश कर रहे हैं जो सभी ईवेंट की सदस्यता लेता है। मैं सभी विषय नामों की एक सूची प्राप्त कर सकता हूं ... लेकिन केवल रनटाइम पर। इसलिए जब हम EventInspector पर हमारी डीबग ऑब्जेक्ट पास करते हैं, तो मुझे रनटाइम पर किसी विधि में विशेषताओं को जोड़ने में सक्षम होना चाहिए।

मैं रनटाइम पर किसी विधि में विशेषताओं को कैसे जोड़ूं?

+0

वैसे: हम जानते हैं कि कैसे आप यह वास्तव में क्या किया तो कृपया: डी –

उत्तर

9

जो आप प्राप्त करने का प्रयास कर रहे हैं वह काफी जटिल है, इसलिए मैं आपको शुरू करने के लिए कुछ प्रदान करने की कोशिश करूंगा। यह मैं क्या लगता है कि तुम क्रम कुछ प्राप्त करने के लिए गठबंधन करने के लिए की आवश्यकता होगी है:

  1. एक विधि Search कि event सदस्यों के सभी खोज के साथ, एक अमूर्त वर्ग AbstractEventDebugger परिभाषित करें, और उन्हें EventInspector साथ पंजीकृत करता है। साथ ही, एक विधि IdentifyEvent परिभाषित करें जो आपको उस ईवेंट की पहचान करने की अनुमति देगी जिसने इसे बुलाया है (यह आपके पर निर्भर करता है - कौन से पैरामीटर होंगे, इत्यादि)।
  2. एक dynamic type का उपयोग कर TypeBuilder (के रूप में वर्णित here), कि अपने वर्ग से विरासत को परिभाषित करें। यह कक्षा आपके debugger ऑब्जेक्ट का वर्ग होगी।
  3. Reflection.Emit.MethodBuilder का उपयोग कर (here देखें) है, जो माता-पिता वर्ग से IdentifyEvent विधि बुला लिया जाएगा और,
  4. Reflection.EmitCustomAttributeBuilder वर्ग (here देखें) का उपयोग संचालकों पर गुण को अपनी कक्षा में हैंडलर देते हैं।
  5. अपने dynamic कक्षा का एक उदाहरण बनाएं और इसे EventInspector पर भेजें।
  6. आग इसे :)

Here कैसे एक विधि है कि कुछ (वास्तव में यह क्लासिक "हैलो दुनिया" है) कॉल बनाने के लिए पर एक नमूना है।

आप क्रम में फेरबदल का एक बहुत करने के लिए यह अच्छी तरह से कर पाने की आवश्यकता होगी, लेकिन आप प्रतिबिंब के बारे में बहुत सीखना होगा।

शुभकामनाएं!

+0

+1 और "यह नहीं किया जा सकता"। धन्यवाद – Nuzzolilo

3

गुण एक संकलन समय विशेषता है (जब तक आप ComponentModel साथ काम कर रहे हैं - लेकिन मैं इसे प्रतिबिंब उपयोग कर रहा है पर शक)। इस प्रकार, आप रनटाइम पर विशेषताओं को जोड़ नहीं सकते हैं। यह एक समान सवाल होगा "मैं रनटाइम पर किसी प्रकार के लिए अतिरिक्त विधि कैसे जोड़ूं?"। नियमित सी #/.NET (प्री-डीएलआर) में, आप नहीं कर सकते हैं।

+0

वास्तव में, यह गतिशील विधानसभाओं और सामान्य विधानसभाओं के मिश्रण से किया जा सकता है। .NET 2.0 उनके लिए समर्थन है, और इसके लिए आपको डीएलआर का उपयोग करने की आवश्यकता नहीं है। –

+3

@Bogdan - लेकिन यह अभी भी आपको किसी मौजूदा प्रकार/सदस्य को विशेषताओं को जोड़ने की अनुमति नहीं देता है। –

1

आप DynamicMethod की दुनिया में तल्लीन करने की जरूरत है। हालांकि, जैसा कि आपको MSIL को जानने की आवश्यकता है, मैं वास्तव में सुझाव देता हूं कि आप अपने वास्तुकला के बारे में सोचें।

+0

शायद उसका आर्किटेक्चर गतिशील है, जिसका लक्ष्य रनटाइम पर कई प्रकार की सेवाएं प्रदान करना है। यह असामान्य नहीं है, और यदि आप मॉड्यूलर सिस्टम चाहते हैं तो वास्तव में इसकी अनुशंसा की जाती है। वास्तविक समाधान देने के लिए –

1

इवेंट इंस्पेक्टर सभी भारी उठाने के लिए इवेंटटॉपिक्स (जो वर्कइटम में संग्रहीत हैं) का उपयोग करता है।

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.diagnostics> 
     <switches> 
      <add name="Microsoft.Practices.CompositeUI.EventBroker.EventTopic" value="All" /> 
     </switches> 
    </system.diagnostics> 
</configuration> 

यह बहुत बनाना चाहिए: प्रत्येक EventTopic वस्तु एक TraceSource के लिए उपयोग

Microsoft.Practices.CompositeUI.EventBroker.EventTopic

कहा जाता है जो तुम इस तरह अपने app.config फ़ाइल में सक्षम कर सकते हैं है उपयोगी संदेशों में से विजुअल स्टूडियो में आपकी डीबग विंडो पर रूट किया जाता है। यदि आप वीएस डीबग विंडो से आगे जाना चाहते हैं तो आपके पास बहुत सारे विकल्प हैं। मैं निम्न आलेख बाहर की जाँच की सलाह देते हैं:

Code Instrumentation with TraceSource My Persoanl Vade Mecum

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