سؤال

أنا أستعد لإنشاء فئة EventArgs عامة لوسيطات الأحداث التي تحمل وسيطة واحدة:

public class EventArg<T> : EventArgs
{
    // Property variable
    private readonly T p_EventData;

    // Constructor
    public EventArg(T data)
    {
        p_EventData = data;
    }

    // Property for EventArgs argument
    public T Data
    {
        get { return p_EventData; }
    }
}

قبل أن أفعل ذلك، هل تحتوي لغة C# على نفس الميزة المضمنة في اللغة؟يبدو أنني أتذكر أنني صادفت شيئًا كهذا عندما ظهر الإصدار C# 2.0، لكن الآن لا يمكنني العثور عليه.

أو بعبارة أخرى، هل يجب علي إنشاء فئة EventArgs العامة الخاصة بي، أم أن C# توفر واحدة؟شكرا لمساعدتك.

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

المحلول

لا.ربما كنت تفكر في EventHandler<T>, ، والذي يسمح لك بتحديد المفوض لأي نوع محدد من EventArgs.

أنا شخصياً لا أشعر بذلك EventArgs<T> على الرغم من ذلك، فهو مناسب تمامًا.المعلومات المستخدمة كـ "حمولة" في وسيطات الحدث يجب أن تكون، في رأيي، فئة مخصصة لجعل استخدامها وخصائصها المتوقعة واضحة جدًا.إن استخدام فئة عامة سيمنعك من القدرة على وضع أسماء ذات معنى في مكانها الصحيح.(ماذا تمثل "البيانات"؟)

نصائح أخرى

يجب أن أقول أنني لا أفهم كل "النقيحين" هنا. I.E. إذا كان لديك بالفعل فئة حقيبة محددة - والتي لديها جميع التفاصيل، الخصائص وما إلى ذلك - لماذا تخلق الاختراق فئة واحدة غير ضرورية إضافية فقط لتتمكن من اتباع آلية الحدث / AGS، نمط التوقيع؟ الشيء - ليس كل ما هو في .NET - أو "مفقود من" لهذه المسألة - هو "جيد" - MS "تصحيح" نفسه لسنوات ... أود أن أقول فقط اذهب وإنشاء واحد - كما فعلت - لأنني كنت بحاجة إليها تماما مثل هذا - وحفظني الكثير من الوقت،

إنها موجودة.على الأقل، فإنه يفعل الآن.

باستطاعتك العثور DataEventArgs<TData> في بعض التجميعات/مساحات الأسماء المختلفة لـ Microsoft، على سبيل المثال Microsoft.Practices.Prism.Events.ومع ذلك، فهذه مساحات أسماء قد لا تجد من الطبيعي تضمينها في مشروعك، لذا يمكنك فقط استخدام التنفيذ الخاص بك.

في حالة اختيار عدم الاستخدام نشور زجاجي, ، ولكن لا تزال ترغب في تجربة عام EventArgs يقترب.

public class GenericEventArgs<T> : EventArgs
{
    public T EventData { get; private set; }

    public GenericEventArgs(T EventData)
    {
        this.EventData = EventData;
    }
}

// استخدم نموذج التعليمات البرمجية التالي للإعلان تمت إضافة Obj حدث

public event EventHandler<GenericEventArgs<TargetObjType>> ObjAdded;

// استخدم نموذج التعليمات البرمجية التالي للرفع تمت إضافة Obj حدث

private void OnObjAdded(TargetObjType TargetObj)
{
    if (ObjAdded!= null)
    {
        ObjAdded.Invoke(this, new GenericEventArgs<TargetObjType>(TargetObj));
    }
}

// وأخيراً يمكنك الاشتراك في قناتك تمت إضافة Obj حدث

SubscriberObj.ObjAdded +=  (object sender, GenericEventArgs<TargetObjType> e) =>
{
    // Here you can explore your e.EventData properties
};

لا يوجد args عام مدمج. إذا اتبعت نمط Microsoft EventHandler، فأنت تنفذ الحاليات المشتقة كما اقترحت: public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } }.

ومع ذلك - إذا قبل دليل أسلوب فريقك تبسيط - يمكن لمشروعك استخدام أحداث خفيفة الوزن، مثل هذا:

giveacodicetagpre.

الاستعمال:

giveacodicetagpre.

عادة ما تستخدم مشاريع POC النهج الأخير.في التطبيق المهني، ومع ذلك، تكون على دراية ببرنامج FX COP مبرر رقم CA1009: https://msdn.microsoft.com/en-us/library/ms182133.aspx

المشكلة مع نوع عام هو أنه حتى لو كان استجواب DerivedType من BaseType، فلن يرث EventArgs (deriveType) من EventArgs (Basetype).وبالتالي فإن استخدام EventArgs (Basetype) سيمنع لاحقا باستخدام نسخة مشتقة من النوع.

السبب غير موجود لأن هذا ما سينتهي به الأمر يحدث هو تنفذ هذا، ثم عند الذهاب لملء T، يجب عليك إنشاء فئة مع خصائص مكتوبة بقوة تعمل كقمشة بيانات لحدثكArg، ولكن في منتصف الطريق من خلال تنفيذ أنك أدرك أنه لا يوجد سبب لا تجعل هذا الفصل يرث من الحالات الطرفية واتصل به جيدا.

ما لم تكن تريد فقط سلسلة أو شيء أساسي أساسي لحقيبة البيانات الخاصة بك، وفي هذه الحالة، توجد قياسي فئات EventArgs في .NET والتي تهدف إلى خدمة أي غرض بسيط،

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