2011-06-28 15 views
7

पहला, GetInvocationList() काम नहीं करेगा, क्योंकि मैं कक्षा के बाहर से उन्हें प्राप्त करने में सक्षम होना चाहता हूं। मुझे लगता है कि यह कुछ प्रतिबिंब जादू के साथ काम करेगा, और यही वह है जिसे मैं समझने की कोशिश कर रहा हूं।प्रतिबिंब का उपयोग करके किसी ईवेंट से अंतर्निहित प्रतिनिधियों की सूची कैसे प्राप्त कर सकता हूं?

fooEventDispatcher.GetType().GetField("FooEvent", BindingFlags.Instance | BindingFlags.NonPublic); 
var field = fieldInfo.GetValue(fooEventDispatcher); 

मैं सिर्फ field साथ क्या करना है पता नहीं है:

यहाँ है कि मैं क्या अभी है। कोई विचार?

+0

क्या आप हमें इनवॉइस सूची को देखने का लक्ष्य क्या कर सकते हैं? इस उद्देश्य के आधार पर, परिणाम प्राप्त करने के लिए प्रतिबिंब से एक आसान तरीका हो सकता है। –

+0

@ जोएल: मैं यूनिट परीक्षण करना चाहता हूं कि कोई ऑब्जेक्ट किसी ईवेंट में स्वयं सदस्यता ले रहा है। आमंत्रण के दुष्प्रभाव का परीक्षण करना एक साफ समाधान नहीं है। – ryeguy

+0

क्यों GetInvocationList() काम नहीं करेगा? यह एक सार्वजनिक विधि है और बाहर से कोई भी उस विधि को कॉल कर सकता है, जब तक कि आपकी कक्षा असेंबली में आंतरिक न हो। – ferosekhanj

उत्तर

9

यह काम करना चाहिए:

var fieldInfo = fooEventDispatcher.GetType().GetField(
       "FooEvent", BindingFlags.Instance | BindingFlags.NonPublic); 
var field = fieldInfo.GetValue(fooEventDispatcher); 
MulticastDelegate eventDelegate = (MulticastDelegate)field.GetValue(fooEventDispatcher); 
if (eventDelegate != null) // will be null if no subscribed event consumers 
{ 
    var delegates = eventDelegate.GetInvocationList(); 
} 

इसके अलावा, आप typeof(SomeFooClass) बजाय fooEventDispatcher.GetType() का उपयोग करना चाहिए अगर प्रकार पहले से ही संकलन समय पर जाना जाता है (जो मुझे लगता है यह है)।

+3

लाइन 4 'मल्टीकास्ट डिलीगेट इवेंट डिलीगेट = (मल्टीकास्टडिलेगेट) फ़ील्ड होना चाहिए; ' – wezten

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

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