هل من الممكن رفع حدث على كائن من خارج هذا الكائن، من دون وظيفة مخصصة

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

  •  22-07-2019
  •  | 
  •  

سؤال

public class a
{
   public event eventhandler test;
   public void  RaiseTest(){//fire test}
}

هل من الممكن رفع الاختبار على هذه الفئة، من خارج هذه الفئة، دون استدعاء الأسلوب؟

وأساسا لدي عدد كبير من الأحداث التي يجب أن تثار يستند إلى مصدر خارجي، ولا تريد إنشاء وظيفة رفع () لكل واحد.

هل من الممكن إنشاء رفع عام () أن يقبل هذا الحدث لأن تثار كمعلمة؟ لذا سيظل يطلق عليه من داخل الصف؟

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

المحلول

ويمكنك القيام بذلك عن طريق التأمل، ولكنه أقل من واضح. إذا قمت بتعريف حدث في C #، سيتم إضافة حقل إلى فئة مع اسم الحدث + "الحدث". إذا كنت استدعاء GetValue في هذا المجال، فإنه سيعود مثيل MulticastDelegate.

وبمجرد الانتهاء من MulticastDelegate، يمكنك الحصول على قائمة الاحتجاج، واستدعاء كل عضو بدوره:

EventArgs e = new EventArgs(myClassInstance);  // Create appropriate EventArgs

MulticastDelegate eventDelagate = 
    this.GetType().GetField(theEventName + "Event",
    System.Reflection.BindingFlags.Instance | 
    System.Reflection.BindingFlags.NonPublic).GetValue(myClassInstance) as MulticastDelegate;

Delegate[] delegates = eventDelagate.GetInvocationList();
foreach (Delegate del in delegates) {  
      del.Method.Invoke(del.Target, new object[] { myClassInstance, e }); 
}

لاحظ أن هذا يتطلب الحصول على حقل غير العامة من مثيل، لذلك سوف تعمل فقط في الثقة الكاملة، وغير محدودة للغاية.

<اقتباس فقرة>   

هل من الممكن إنشاء رفع عام () أن يقبل هذا الحدث لأن تثار كمعلمة؟ لذا سيظل يطلق عليه من داخل الصف؟

نعم. سيكون من السهل نسبيا لتعديل التعليمات البرمجية أعلاه للقيام بذلك. مجرد استبدال "myClassInstance" مع هذا. وهذا سوف يسمح هذا الواقع للعمل بشكل صحيح في الثقة الكاملة، وكذلك، منذ BindingFlag غير العامة لن تكون هذه القضية.

نصائح أخرى

<اقتباس فقرة>   

هل من الممكن رفع الاختبار على هذه الفئة، من خارج هذه الفئة، دون استدعاء الأسلوب؟

والجواب باختصار: لا

والطبقة فقط الإعلان عن الحدث يمكن رفعه

<اقتباس فقرة>   

هل من الممكن إنشاء رفع عام () أن يقبل هذا الحدث لأن تثار كمعلمة؟ لذا سيظل يطلق عليه من داخل الصف؟

وأنا لا أعتقد ذلك، على الأقل ليس بسهولة ... حتى باستخدام التفكير، وليس هناك طريقة EventInfo.Invoke. AFAIK، والطريقة الوحيدة لرفع الحدث هو ثابت من داخل الطبقة

وتحرير: في الواقع أنه يمكن القيام به (انظر الجواب ريد)، ولكن مع الحد أن التطبيق لديه لتشغيل في ثقة كاملة

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