هل من الممكن رفع حدث على كائن من خارج هذا الكائن، من دون وظيفة مخصصة
سؤال
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، والطريقة الوحيدة لرفع الحدث هو ثابت من داخل الطبقة
وتحرير: في الواقع أنه يمكن القيام به (انظر الجواب ريد)، ولكن مع الحد أن التطبيق لديه لتشغيل في ثقة كاملة