PDA

View Full Version : سوال: چرا رویدادی که با پارامترهای Generic ساخته میشه در قسمت رویدادها نمیاد؟



mohsen_csharp
پنج شنبه 27 فروردین 1388, 09:45 صبح
با سلام
من یک کلاس WaterMarkBox نوشتم که از از TextBox به ارث برده شده . من رویدادم رو بدین صورت تعریف کردم

[Browsable(true)]
public event EventHandler<ValueChangedEventArgs<string>> ValueTextChangedEvent;اینم کلاس ValueChangedEventArgs

public class ValueChangedEventArgs<T>:EventArgs
{
public ValueChangedEventArgs(){ }
public bool Cancel { get; set; }
public T OldValue { get; set; }
}حالا این رویداد در قسمت design نمیاد ولی در قسمت کد وجود داره و قابل استفاده است
حتی من در بالای کلاس این رویداد رو به عنوان DefaultEvent تعریف کردم بدین صورت:

[DefaultEvent("ValueTextChangedEvent")]
class WaterMarkBox : TextBox
{حالا وقتی موقع design روی این کنترل دبل کلیک می کنم رویداد مورد نظر رو تولید می کنه ولی به صورت اشتباه:

private void waterMarkBox2_ValueTextChangedEvent(object sender)
{
}که درستش این میشه:

void waterMarkBox2_ValueTextChangedEvent(object sender, mohsen.ValueChangedEventArgs<string> e)
{
}از دوستان کسی هست که بنده رو راهنمایی کنه؟

prankster
پنج شنبه 27 فروردین 1388, 12:10 عصر
ایراد جالبیه! مدتی هم با کد کلنجار رفتم، به نظر کاملا درست می آید. احتمال دارد bug مربوط به visual studio باشد.

در هر حال اگر EventHandler را به صورت زیر تعریف کنید مشکل نمایش در رویدادها حل خواهد شد اما ایجاد اتوماتیک متد برای handler کماکان مشکل دارد:



[Serializable]
public delegate void ValueChangedEventHandler<T>(object sender, ValueChangedEventArgs<T> e) where T:class;

تعریف event:


[Browsable(true)]
public event ValueChangedEventHandler<string> ValueTextChangedEvent;


به نظر می رسد محیط designer امکان Load کردن delegate شامل کد generic را پیدا نمی کند، از آنجا که به متد generic می توان همه انواع object ها را ارسال کرد شاید محیط designer برای جلوگیری از خطا event را اتوماتیک ایجاد نمی کند.
من پارامتر generic را به ISerializable، IConvertible و class فیلتر کردم اما نتیجه نداشت!

کسی تجربه ای دارد؟