كيفية العثور على الكائنات التي يتم الاستماع إلى هذا الحدث ؟

StackOverflow https://stackoverflow.com/questions/1639076

  •  08-07-2019
  •  | 
  •  

سؤال

لدي الدرجة مع الحدث:

public event MyEventHandler MyEvent;

هل هناك أي طريقة للحصول على مؤشر إلى مجموعة من الكائنات (عن طريق التفكير أو غير ذلك) أن تستمع إلى هذا الحدث ؟

تحرير - آسفة لنقل القائمين أنا تحتاج أن تكون قادرة على القيام بذلك باستخدام التفكير قبل الميلاد لدي سلسلة القيمة تمثل اسم الحدث, وأنا بحاجة إلى العثور على المستمعين.لا أستطيع أن أرى طريقة واضحة للوصول إلى GetInvocationList المنشأة باستخدام التفكير...

وذلك بفضل!

هل كانت مفيدة؟

المحلول

List<object> targets = MyEvent.GetInvocationList().Select(d => d.Target).ToList();

القيام بذلك عن طريق انعكاس سوف يكون غموض نوعا ما, حتى لو كان ذلك ممكنا ، للأسف ، لأن هذه الجملة:

public event EventHandler MyEvent;

...

MyEvent(this, EventArgs.Empty);

هو نحوي السكر.هذا ما تفعله في الواقع هو:

private EventHandler compilerGeneratedName;

public event EventHandler MyEvent
{
    add { compilerGeneratedName += value; }
    remove { compilerGeneratedName -= value; }
}

...

compilerGeneratedName(this, EventArgs.Empty);

وبعبارة أخرى, الأحداث كان دائما التعريفي الاختزال تلك الخصائص فقط تلقت مؤخرا.ونتيجة لذلك ، من أجل الحصول على الاحتجاج قائمة عليك فحص خاص متغير ، وهو يدعى من قبل المترجم (ما لم يكن بالطبع يمكنك استخدام تخفف جملة نفسك أعلم اسم المثيل متغير).

لا يوجد طريقة مباشرة إلى مشارك خارجيا يتعرض event بناء مع دعم معالج أي أكثر من هناك وسيلة مباشرة إلى التعادل property إلى دعم متغير:وهي بسبب ليس بالضرورة أن علاقة واحدة.من المرجح جدا هناك, ولكن كقاعدة عامة لا يجب أن يكون بهذه الطريقة.

يمكنك محاولة استخدام انعكاس لفحص المتغيرات الخاصة التي السليم EventHandler<> نوع على نوع يعلن حالة (لاحظ أن عليك أن تفعل ذلك في نوع معين أن يعلن هذا الحدث ، لا على فئة فرعية) ومعرفة ما إذا كان يمكنك تحديد نوع العلاقة مع أسماء ، ولكن هذا لن يكون غير موثوق الحل في أحسن الأحوال.

نصائح أخرى

MulticastDelegate.GetInvocationList()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top