PDA

View Full Version : ایجاد یک even برای dll یا اسمبلی



m0rteza
دوشنبه 15 بهمن 1386, 20:28 عصر
سلام خدمت دوستان
dll یا اسمبلی نوشتم که احتیاج داره یک رویداد داشته باشه . یعنی زمانی که از dllاستفاده شد این رویداد بیاد توی قسمت even ها در کنار بقیه even ها قرار بگیره .
آیا میشه even ها رو به راحتی مثل تابع از even ه دیگه صدا رد؟
ممنون

اَرژنگ
سه شنبه 16 بهمن 1386, 05:21 صبح
سلام خدمت دوستان
dll یا اسمبلی نوشتم که احتیاج داره یک رویداد داشته باشه . یعنی زمانی که از dllاستفاده شد این رویداد بیاد توی قسمت even ها در کنار بقیه even ها قرار بگیره .
آیا میشه even ها رو به راحتی مثل تابع از even ه دیگه صدا رد؟
ممنون
سوالتان معنی نمیده.
چکاری میخواهید انجام بدید؟
ایونتها معمولا در کمپوننتها استفاده میشند، این روش طراحی استاندارد نیست که ایونت به خودی خود در یک اسمبلی باشد.
هدفتان چی هست؟

Masoud_TB
سه شنبه 16 بهمن 1386, 08:42 صبح
برای ایجاد یک رویداد در یک کلاس (نه در یک Assembly) شما باید 5 مرحله پیاده سازی داشته باشی. فرض کن من کلاسی دارم که داخلش یک متد به نام DoSth() وجود داره وقتی که پارامتر این متد بیشتر از 1000 باشه می خواهم یک رویداد به نام OnOverflow اتفاق بیافتد و مقدار پارامتر رو هم به عنوان یکی از اطلاعات event من باشه.

مرحله اول ایجاد یک Delegate

در این مرحله ابتدا یک delegate با ساختار مورد نظر رویدادمان ایجاد می کنیم. دقت کن که محل ایجاد delegate من داخل namespace است:


public delegate void OverflowHandler(object sender,OverflowEventArgs e);
مرحله دوم ایجاد شیء رویداد در کلاس:
حالا در کلاس مورد نظرم یک reference به آن ایجاد می کنم:


public class myClass
{
public event OverflowHandler Overflow;
مرحله سوم ایجاد کلاس
در این مرحله باید کلاس مربوط به اطلاعات رویدادم یعنی OverflowEventArgs رو ایجاد کنم. دقت کن که این کلاس از کلاس EventArgs به ارث می رود:


public class OverflowEventArgs: EventArgs
{
private int overflowValue;
public int OverflowValue
{
get
{
return overflowValue;
}
}
public OverflowEventArgs(int overflowValue)
{
this.overflowValue = overflowValue;
}
}


مرحله چهارم ساختن یک متد در کلاس
در این مرحله باید یک متد در کلاس مورد نظرمان ایجاد کنیم که در حقیقت رویداد ما را اعلام می نماید (در کلاس myClass)


protected void OnOverflow(int overflowValue)
{
if(Overflow != null)
Overflow(this,new OverflowEventArgs(overflowValue));
}
! اگر دقت کنی ابتدا Overflow با مقدار null مقایسه شده است. این به این معنی است که اگر کسی EventHandlerبه این متد ست کرده باشد.
!! دقت داشته باش که این متد به صورت protected تعریف شده تا کلاس هایی که از این کلاس به ارث می روند قابلیت فراخوانی آن را داشته باشند.

مرحله پنجم - اعلام رویداد
در مرحله آخر در زمانی که باید رویداد اعلام شود متدی که به صورت protected تعریف شده را فراخوانی می کنیم:


public void DoSth(int val)
{
if(val > 1000)
OnOverflow(val);
// reset of your code
}
امیدوارم که به کارت بیاید. می تونی سرس کد رو دانلود هم کنی:

Masoud_TB
سه شنبه 16 بهمن 1386, 08:45 صبح
نکته ای که فراموش کردم این که اگر کسی بخواهد از این event استفاده کنی کافیه که یک eventHandler به این event وصل کند و ....


void Main()
{
myClass m = new myClass();
m.Overflow += new OverflowHandler(m_Overflow);
m.Dosth(1500);
}
static void m_Overflow(object sender, OverflowEventArgs e)
{
Console.WriteLine("Overflow Occured with value:{0}",e.OverflowValue);
}

اَرژنگ
سه شنبه 16 بهمن 1386, 15:11 عصر
فرض کن من کلاسی دارم که داخلش یک متد به نام DoSth() وجود داره وقتی که پارامتر این متد بیشتر از 1000 باشه می خواهم یک رویداد به نام OnOverflow اتفاق بیافتد و مقدار پارامتر رو هم به عنوان یکی از اطلاعات event من باشه.

با تشکر از مثالتان.
یک چند نکته کوچیک :
۱)در طرز تفکر شئیگرا معمولا ایونتها برایه سیگنال دادن به کلاینتها که یک خص درونی عوض شده و یا یک اتفاقی افتاده بکار میرند، اگر یک پروپرتی داشتید که ایونت عوض شدن داشت و یا یک متد مانند Search که یک OnFind ایونت داشت یکمقداری مثال بهتر میشد.

۲)Overflow معمولا با یک مثال برایه exception ببیشتر میخوره تا ایونت، ولی این بازهم قابل هست.

۳)myClass برایه نام این کلاس ۲ تا اشکال کوچیک دارد، MyClass معمولیتر است، برایه مثال به Class Naming Convetions (http://www.akadia.com/services/naming_conventions.html)یک نگاه بندازید

OverflowEventArgs (۴ را میشه یک کلاس nested تعریفش کرد (مضایا و مضارت این کار را باید نکته سنجی کنیم)

۵)به جایه متد Dosth که معنی نمیده (شاید هم میده ولی من نمیدونم)، یک پروپرتی و یک متد با اسم بهتری میبود مثال قشنگتر میشد،

اگرچه مثال ما از نظر یاد دادن کاملا مقصود را میرساند ولی شما که زحمت کشیدید دیگر سنگ تمام بگذارید که این مثال بشد به عنوان یک رفرانس مداوما همه را بهش رجوع بدیم (بارها این سوال ایونت پرسیده شده و این مثال شما به خوبی جوابش میده).

با سپاس از زحماتتان، اگر مثال بالا را ویرایش دادید یک پست بزنید که این پست را پاک کنم.

hassan razavi
سه شنبه 16 بهمن 1386, 15:43 عصر
با تشکر از مسعود جان ، با مورد شماره 1 جناب ارژنگ خیلی موافقم.