در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش Reflection در برنامه های دات نت قسمت 3 : Late Binding

در دو قسمت قبلی آموزش با مبحث Reflection و نحوه بدست آوردن اطلاعات مربوط به Type ها در زبان سی شارپ آشنا شدیم. در این قسمت از آموزش به مبحث Late Binding می پردازیم. بعد از به دست آوردن اطلاعات Type ها امکان ایجاد شئ و استفاده از اعضاء آن امکان پذیر است. یعنی ما می توانیم بوسیله استفاده از یکسری قابلیت ها و دستورات شئ ها را ایجاد کرده، متدها را فراخوانی کنیم یا خصوصیات را مقدار دهی کنیم. در ابتدا باید با کلاسی به نام Activator که در فضای نام System تعریف شده آشنا شویم. این کلاس به ما قابلیت ایجاد اشیاء در زمان اجرا را می دهد. کلاسی که در قسمت قبلی تعریف کردیم را مجدد یادآوری می کنیم:

public class Person
{
    public Person()
    {
    }

    public Person(int id, string firstName, string lastName)
    {
        Id = id;
        FirstName = firstName;
        LastName = lastName;
    }

    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string FullName
    {
        get { return string.Format("{0} {1}", FirstName, LastName); }
    }

    public void DisplayFullName()
    {
        Console.WriteLine("{0} {1}", FirstName, LastName);
    }
}

با استفاده از کلاس Activator و متد CreateInstance که یک متد static در این کلاس است، می توانیم بعد از به دست آوردن Type کلاس، اقدام با ساخت شئ کنیم. به کد زیر توجه کنید:

Type type = typeof (Person);
object person = Activator.CreateInstance(type);

همانطور که مشاهده می کنید Type کلاس Person به عنوان پارامتر به متد CreateInstance پاس داده شده است. بعد از اجرای کد بالا، متغیر person حاوی یک شئ از نوع Person است. اما نوع بازگشتی متد CreateInstance از نوع object است و می بایست بعد از ساخت شئ آن را به نوع Person تبدیل کنیم. کد بالا را به صورت زیر تغییر می دهیم:

Type type = typeof (Person);
Person person = (Person)Activator.CreateInstance(type);

فراخوانی متد CreateInstance به صورت بالا، باعث فراخوانی سازنده پیش فرض (Default Constructor) کلاس Person می شود. می توان بعد از پارامتری که Type را مشخص می کند، لیست پارامترهایی که برای ایجاد شئ از روی یک سازنده دیگر مورد نیاز است را مشخص کرد. برای اینکار می بایست حتماً Constructor مورد نظر تعریف شده باشد. برای کلاس Person سازنده ای با سه پارامتر با نوع های int و string و string تعریف شده که می توان به صورت زیر، زمان فراخوانی متد CreateInstance پارامترهای مورد نظر را به آن پاس داد:

Type type = typeof (Person);
Person person = (Person) Activator.CreateInstance(type, 12, "Hossein", "Ahmadi");

در اینجا ما برای ساخت شئ نیاز به مشخص کردن Type و تبدیل شئ ایجاد شده به نوع مورد نظر را داریم. یک حالت دیگر از متد CreateInstance وجود دارد که از نوع جنریک است و بر اساس پارامتر جنریک اقدام به ساخت شئ می کند:

Person person = Activator.CreateInstance();

اما مشکلی که وجود دارد، نمی توان پارامتر های مورد نظر برای سازنده را به آن پاس داد. برای رفع این مشکل می توانیم خودمان کلاسی برای ساخت اشئاء به بر اساس پارامتر generic ایجاد کنیم:

public class AdvanceActivator
{
    public static T CreateInstance(params object[] parameters)
    {
        return (T)System.Activator.CreateInstance(typeof (T), parameters);
    }     
}

در کد بالا دقت کنید، کلمه کلیدی typeof بر روی پارامتر جنریک T استفاده شده است، یعنی زمان استفاده از متد CreateInstance، وقتی ما برای مثال نوع Person را برای T مشخص می کنیم، دستور typeof در حقیقت Type کلاس Person را برای ما بر میگرداند و ادامه ماجرا نیز که مانند مثال اولی است که در این بخش توضیح دادیم. استفاده از کلاس بالا نیز به صورت زیر خواهد بود:

Person person = AdvanceActivator.CreateInstance(10, "Hossein", "Ahmadi");

اما گفتیم بحث Late Binding تنها قابلیت ایجاد شئ نیست و می توانیم نسبت به مقدار دهی خصوصیات یا فراخوانی متد ها اقدام کنیم. برای مثال، فرض کنید با دستور زیر شئ ای از روی Person ساختیم، اما عملیات تبدیل object به Person را انجام ندادیم. مطمئناً دسترسی به خصوصیات Person نیز نداریم. با مکانیز زیر می توانیم خصوصیات کلاس ها را مقدار دهی کنیم:

var personType = typeof (Person);

var personInstance = Activator.CreateInstance(personType);

PropertyInfo firstNameProperty = personType.GetProperty("FirstName");

firstNameProperty.SetValue(personInstance, "Hossein");

Console.WriteLine(firstNameProperty.GetValue(personInstance));  

در ابتدا Type کلاس Person را بدست می آوریم. بعد با متد CreateInstance یک شئ از روی Person می سازیم. در قدم بعدی با دستور GetProperty اطلاعات مربوط به خصوصیت FirstName را استخراج می کنیم. کلاس PropertyInfo که در بخش قبلی با آن آشنا شدیم دو متد دارد با نام های SetValue که برای مقدار دهی استفاده می شود و GetValue که برای گرفتن مقدار خصوصیت استفاده می شود. متد SetValue دو پارامتر ورودی دریافت می کند، اولی شئ ای از نوع Person که قرار است عملیات مقدار دهی بر روی آن انجام شود و دوم مقداری که قرار است در خصوصیت قرار بگیرد. اما متد GetValue تنها یک پارامتر می گیرد، شئ ای که قرار است مقدار خصوصیت از آن استخراج شود. مقدار بازگشتی متد GetValue از نوع Object است که می توان در صورت نیاز آن را به نوع داده مورد نظر Cast کرد.

علاوه بر مقدار دهی خصوصیات، می توان عملیات فراخوانی متدها را نیز بوسیله Reflection انجام داد. برای مثال، متد DisplayFullName را کلاس Person به صورت زیر می توانیم فراخوانی کنیم:

var personType = typeof (Person);

var personInstance = Activator.CreateInstance(personType, 10, "Hossein", "Ahmadi");

var method = personType.GetMethod("DisplayFullName");
method.Invoke(personInstance, null);

در کد بالا، با استفاده از متد GetMethod اطلاعات مربوط به متد مورد نظر را بدست آورده و بوسیله متد Invoke که در کلاس MethodInfo تعریف شده است، می توان نسبت به فراخوانی متد مورد نظر اقدام کرد. دقت کنید، متد Invoke دو پارامتر به عنوان ورودی می گیرد، پارامتر اول شئ ای که قرار است عملیات فراخوانی بر روی آن انجام شده و پارامتر دوم آرایه ای از object که پارامتر های متد را مشخص می کند. در مثال بالا، به دلیل اینکه متد DisplayFullName هیچ پارامتری ندارد، مقدار null را به عنوان لیست پارامتر ها پاس دادیم.

مفهومی که در این بخش با آن آشنا شدیم، Late-Binding بود که اجازه ساخت و استفاده از اشیاء در زمان اجرا را بوسیله Reflection به ما می دهد. امیدوارم این قسمت از آموزش نیز مورد توجه شما قرار گرفته باشد. در قسمت بعدی در مورد Class Library ها، اسمبلی ها و نحوه بارگذاری و استفاده از اسمبلی ها بوسیله Reflection صحبت خواهیم کرد. ITPRO باشید

نویسنده: حسین احمدی
انجمن تخصصی فناوری اطلاعات ایران
#آموزش_زبان_سی_شارپ #مفهوم_late-binding_در_سی_شارپ #کلاس_activator_در_سی_شارپ #ساخت_اشیاء_با_متد_createinstance #reflection_در_زبان_سی_شارپ
عنوان
1 آموزش Reflection در برنامه های دات نت قسمت 1 : معرفی رایگان
2 آموزش Reflection در برنامه های دات نت قسمت 2 : Meta Data Viewer رایگان
3 آموزش Reflection در برنامه های دات نت قسمت 3 : Late Binding رایگان
4 آموزش Reflection در برنامه های دات نت قسمت 4 : Attibute ها رایگان
زمان و قیمت کل 0″ 0
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره پاییزه می تونی امروز ارزونتر از فردا خرید کنی ....