مشخصات مقاله
-
0
-
0.0
-
6964
-
0
-
0
آموزش نمونه سازی کلاس ها در زبان C#
آموزش نمونه سازی کلاس Class در زبان C# :
تا کنون در چهارچوب کاری .NET با نمونه ها types و اشیای object ای که از قبل نمونه سازی شده اند، کار کرده ایم. اما به وسیله قابلیت Reflection، می خواهیم عمل نمونه سازی را در هنگام اجرا یا RunTime انجام دهیم و برای این منظور داشتن نام کلاسی که می خواهیم از آن نمونه بسازیم، ضروری است. چندین راه برای انجام کار فوق وجود دارد. اما من روشی را ترجیح می دهد که در آن یک رفرنس به تابع سازنده شی یا Constructor ایجاد کرده و آن را فعال می کنیم. سپس مقدار برگشتی از تابع را به عنوان نمونه خود به کار می بریم.
کد زیر، به صورت عملی نحوه نمونه سازی از کلاس ها در زمان اجرای برنامه های C# را نشان داده است. ابتدا کد مثال را مرور کرده و در ادامه به تشریح آن خواهیم پرداخت :
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ReflectionTest
{
class Program
{
static void Main(string[] args)
{
Type testType = typeof(TestClass);
ConstructorInfo ctor = testType.GetConstructor(System.Type.EmptyTypes);
if(ctor != null)
{
object instance = ctor.Invoke(null);
MethodInfo methodInfo = testType.GetMethod("TestMethod");
Console.WriteLine(methodInfo.Invoke(instance, new object[] { 10 }));
}
Console.ReadKey();
}
}
public class TestClass
{
private int testValue = 42;
public int TestMethod(int numberToAdd)
{
return this.testValue + numberToAdd;
}
}
}
در کد مثال فوق، یک کلاس ساده به نام TextClass را جهت نمایش نحوه کارایی ایجاد کرده ایم. این کلاس دارای یک فیلد خصوصی (Private field) و یک متد عمومی (public method) می باشد. هر کلاس، مقدار فیلد خصوصی را به همراه مقدار پارامتر ارسالی که به آن اضافه شده است را بر می گرداند. حال کاری که ما می خواهیم انجام دهیم، ایجاد یک نمونه جدید از کلاس TextClass و سپس فراخوانی متد TextMethod و ارسال خروجی بر روی Console است.
همچنین در کد مثال فوق، ما امکان استفاده مستقیم از متد typeof() بر روی کلاس TextClass را داشتیم. اما در برخی موارد، شما ممکن است مجبور شوید منحصرا از نام خود کلاس مورد نظر استفاده کنید. در چنین موردی، بایستی یک رفرنس را از طریق اسمبلی که کلاس در آن تعریف شده است، ایجاد نمایید، همانند آنچه در بخش کار با Type خدمتتان عرض کردیم.
بنابراین با داشتن یک رفرنس Type به کلاس مورد نظر، می توانیم تابع سازنده پیش فرض default Constructor را با استفاده از قید GetConstructor() احضار کنیم. سپس مقدار System.Type.Empty Types را به عنوان پارامتر، بدان پاس می دهیم. در مواردی هم که به دنبال یک Constructor خاصی هستیم، بایستی آرایه ای از Type را تعیین نموده که هر کدام مشخص می کنند هر Constructor، چه پارامترهایی را دریافت خواهند کرد.
تا زمانی که یک رفرنس به تابع سازنده Constructor داریم، می توانیم به سادگی با فراخوانی متد invoke() یک نمونه از کلاس TestClass را ایجاد نماییم. اگر نخواستیم پارامتری را به تابع ارسال کنیم، بایستی مقدار null را به متد invoke() پاس دهیم. همچنین از متد GetMethod() به همراه نام متدی که لازم داریم را برای گرفتن تابع TestMethod() استفاده خواهیم کرد. در نهایت باز از ابزار کاربردی invoke() برای فراخوانی تابع فوق، بهره می گیریم. اما این بار نیاز خواهیم داشت تا یک پارامتر از نوع آرایه از اشیا (array of objects) را تعیین کنیم.
اما به لطف Reflection، می توانید به صورت سریع مثلا عدد 10 را به عنوان تنها پارامتر مورد نیاز ارسال کرده و سپس خروجی را پس از اجرا و فعال شدن متد مشاهده می کنیم.