هي الطبقات EventArg المطلوب الآن أن لدينا الأدوية
سؤال
ومع الأدوية، وهناك من أي وقت مضى سببا لخلق محددة مستمدة الطبقات EventArg
ويبدو الآن يمكنك ببساطة استخدامها على الطاير مع تطبيق عام.
ويجب أن أذهب تعهدتا كل من الأمثلة التي ذكرتها وإزالة دروسي eventArg (StringEventArgs، MyFooEventArgs، الخ.).
public class EventArgs<T> : EventArgs
{
public EventArgs(T value)
{
m_value = value;
}
private T m_value;
public T Value
{
get { return m_value; }
}
}
المحلول
ما كنت تصف هي أساسا الصفوف والقيم تجميع تستخدم لغرض معين. فهي مفيدة في بناء البرمجة الوظيفية ودعم هذا النمط بشكل جيد للغاية.
والجانب السلبي هو أن قيمهم ليست مسمى، وأنها تتطلب السياق إلى أن يفهم. EventArgs
بطبيعتها وغالبا ما تستهلك بعيدا عن سياقها ذات الصلة. لذلك، يمكن-الصفوف (tuple) سقو EventArgs
يكون مربكا جدا بالنسبة للمستهلك.
ودعونا نقول لدينا وقد تم الانتهاء حدث يشير إلى بعض الانقسام، وأنه يحمل البسط، القاسم، والنتيجة:
public event EventHandler<EventArgs<double, double, double>> Divided;
ومعالج الحدث لديه بعض الغموض:
private void OnDivided(object sender, EventArgs<double, double, double> e)
{
// I have to just "know" this - it is a convention
var numerator = e.Value1;
var denominator = e.Value2;
var result = e.Value3;
}
وهذا من شأنه أن يكون أكثر وضوحا مع EventArgs
تمثل الحدث:
private void OnDivided(object sender, DividedEventArgs e)
{
var numerator = e.Numerator;
var denominator = e.Denominator;
var result = e.Result;
}
والجنيسة الطبقات EventArgs
قابلة لإعادة الاستخدام سهولة تطوير آلية على حساب التعبير عن النوايا.
نصائح أخرى
ونظرة على المادة عام مخصص EventArgs كتبه ماثيو كوكران ، في هذا المقال يصف كيفية توسيعه أبعد من ذلك مع اثنين وثلاثة أعضاء.
وعن طريق EventArgs العامة لها استخداماتها، وبالطبع إساءة لهم، كما يتم فقدان نوع من المعلومات في هذه العملية.
public class City {...}
public delegate void FireNuclearMissile(object sender, EventArgs<City> args);
public event FireNuclearMissile FireNuclearMissileEvent;
public delegate void QueryPopulation(object sender, EventArgs<City> args);
public event QueryPopulation QueryPopulationEvent;
في المثال التالي أنه هو نوع آمنة، ولكن أكثر قليلا LOC:
class City {...}
public class FireNuclearMissileEventArgs : EventArgs
{
public FireNuclearMissileEventArgs(City city)
{
this.city = city;
}
private City city;
public City City
{
get { return this.city; }
}
}
public delegate void FireNuclearMissile(object sender, FireNuclearMissileEventArgs args);
public event FireNuclearMissile FireNuclearMissileEvent;
public class QueryPopulationEventArgs : EventArgs
{
public QueryPopulationEventArgs(City city)
{
this.city = city;
}
private City city;
public City City
{
get { return this.city; }
}
}
public delegate void QueryPopulation(object sender, QueryPopulationEventArgs args);
public event QueryPopulation QueryPopulationEvent;
وكما قال TcKs بالفعل: استخدام EventArgs<T>
إذا كنت بحاجة فقط لتمرير قيمة واحدة، وإلا تنبع من EventArgs
(أو EventArgs<T>
، كل ما تريد)
وأعتقد EventArgs على غرار الصفوف (tuple) مفيدة. تماما مثل الصفوف (tuple)، ويمكن أن يساء استخدامها، ولكن يبدو لي الكسل هو أقوى أن إحساسي الحذر. I تنفيذ ما يلي:
public static class TupleEventArgs
{
static public TupleEventArgs<T1> Create<T1>(T1 item1)
{
return new TupleEventArgs<T1>(item1);
}
static public TupleEventArgs<T1, T2> Create<T1, T2>(T1 item1, T2 item2)
{
return new TupleEventArgs<T1, T2>(item1, item2);
}
static public TupleEventArgs<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)
{
return new TupleEventArgs<T1, T2, T3>(item1, item2, item3);
}
}
public class TupleEventArgs<T1> : EventArgs
{
public T1 Item1;
public TupleEventArgs(T1 item1)
{
Item1 = item1;
}
}
public class TupleEventArgs<T1, T2> : EventArgs
{
public T1 Item1;
public T2 Item2;
public TupleEventArgs(T1 item1, T2 item2)
{
Item1 = item1;
Item2 = item2;
}
}
public class TupleEventArgs<T1, T2, T3> : EventArgs
{
public T1 Item1;
public T2 Item2;
public T3 Item3;
public TupleEventArgs(T1 item1, T2 item2, T3 item3)
{
Item1 = item1;
Item2 = item2;
Item3 = item3;
}
}
ويمكن استخدامها على النحو التالي (عند استخدامها مع الحدث تمديد جامع )
public event EventHandler<TupleEventArgs<string,string,string>> NewEvent;
NewEvent.Raise(this, TupleEventArgs.Create("1", "2", "3"));