کاربرد Reflection در سی شارپ
Reflection در سیشارپ امکان بررسی کلاسها، متدها و ویژگیها را در زمان اجرا فراهم کرده و توسعه برنامه را انعطافپذیرتر میکند.
کاربرد Reflection در سی شارپ (#C)
در زبان برنامهنویسی سیشارپ (#C)، یکی از قابلیتهای قدرتمند و پیشرفتهای که در بستر .NET Framework و .NET Core ارائه شده است، Reflection یا «بازتاب» نام دارد.
Reflection مکانیزمی است که به برنامه اجازه میدهد در زمان اجرا (Runtime) اطلاعات مربوط به اسمبلیها، کلاسها، متدها، ویژگیها (Properties)، فیلدها و سایر اعضای برنامه را بررسی کرده و حتی آنها را به صورت پویا ایجاد یا فراخوانی کند.
به بیان ساده، Reflection به برنامه این امکان را میدهد که ساختار خودش یا سایر اسمبلیها را مشاهده و تحلیل کند.
این قابلیت در بسیاری از فریمورکها، ابزارهای تست، سیستمهای Dependency Injection، ORMها و افزونههای نرمافزاری مورد استفاده قرار میگیرد.
Reflection چیست؟
Reflection مجموعهای از کلاسها و APIهای موجود در فضای نام (Namespace) زیر است:
-
System.Reflection
این فضا امکاناتی را فراهم میکند تا بتوان اطلاعات مربوط به انواع داده (Types) و اعضای آنها را در زمان اجرا استخراج کرد.
به عنوان مثال با Reflection میتوان:
-
- نام کلاسها را دریافت کرد.
- متدهای یک کلاس را مشاهده نمود.
- ویژگیهای یک شیء را خواند.
- نمونهای از یک کلاس را به صورت پویا ایجاد کرد.
- متدها را بدون دانستن نام آنها در زمان کامپایل اجرا نمود.
اهمیت Reflection در سی شارپ
در برنامههای معمولی، ساختار کلاسها و متدها در زمان کامپایل مشخص است؛ اما در برخی پروژهها نیاز داریم اطلاعات را در زمان اجرا کشف کنیم.
Reflection این امکان را فراهم میکند که:
-
برنامه انعطافپذیرتر شود.
-
قابلیت توسعه افزونهها ایجاد گردد.
-
وابستگیها به صورت پویا مدیریت شوند.
-
ابزارهای عمومی و فریمورکها توسعه یابند.
به همین دلیل بسیاری از فناوریهای مدرن داتنت بر پایه Reflection ساخته شدهاند.
Assembly در Reflection
اولین مفهوم مهم در Reflection، اسمبلی (Assembly) است.
Assembly در واقع فایل اجرایی یا کتابخانه داتنت است:
-
EXE
-
DLL
برای دسترسی به اسمبلی جاری میتوان از کد زیر استفاده کرد:
using System.Reflection;
Assembly assembly = Assembly.GetExecutingAssembly();
سپس اطلاعات اسمبلی قابل استخراج است:
Console.WriteLine(assembly.FullName);
خروجی شامل:
-
نام اسمبلی
-
نسخه
-
فرهنگ (Culture)
-
Public Key
خواهد بود.
دریافت اطلاعات Type
در Reflection مفهوم Type اهمیت بسیار زیادی دارد.
مثال:
Type type = typeof(string);
یا:
string name = "Ali";
Type type = name.GetType();
اکنون میتوان اطلاعات مختلفی را دریافت کرد:
Console.WriteLine(type.Name);
Console.WriteLine(type.Namespace);
Console.WriteLine(type.BaseType);
دریافت متدها در سی شارپ
یکی از رایجترین کاربردهای Reflection مشاهده متدهای یک کلاس است.
مثال:
Type type = typeof(string);
MethodInfo[] methods = type.GetMethods();
نمایش نام متدها:
foreach(MethodInfo method in methods)
{
Console.WriteLine(method.Name);
}
در این حالت تمام متدهای کلاس String نمایش داده میشوند.
دریافت Properties در سی شارپ
برای مشاهده ویژگیهای یک کلاس:
PropertyInfo[] properties =
type.GetProperties();
مثال:
foreach(PropertyInfo property in properties)
{
Console.WriteLine(property.Name);
}
با این روش تمام Propertyهای کلاس استخراج میشوند.
دریافت فیلدها در سی شارپ
Reflection امکان مشاهده فیلدها را نیز فراهم میکند.
FieldInfo[] fields =
type.GetFields();
سپس:
foreach(FieldInfo field in fields)
{
Console.WriteLine(field.Name);
}
ایجاد شیء به صورت پویا
یکی از مهمترین کاربردهای Reflection ساخت اشیاء در زمان اجرا است.
فرض کنید کلاس زیر وجود دارد:
public class Person
{
public string Name { get; set; }
}
ایجاد شیء:
Type type = typeof(Person);
object obj =
Activator.CreateInstance(type);
در اینجا بدون استفاده مستقیم از کلمه new شیء ساخته شده است.
فراخوانی متدها به صورت پویا
Reflection میتواند متدها را در زمان اجرا اجرا کند.
مثال:
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}
فراخوانی:
Type type = typeof(Calculator);
object calculator =
Activator.CreateInstance(type);
MethodInfo method =
type.GetMethod("Add");
object result =
method.Invoke(calculator,
new object[] {10,20});
خروجی:
30
خواهد بود.
تغییر مقدار Property در سی شارپ
Reflection امکان خواندن و تغییر مقادیر ویژگیها را فراهم میکند.
مثال:
Person person = new Person();
دریافت Property:
PropertyInfo property =
typeof(Person).GetProperty("Name");
تنظیم مقدار:
property.SetValue(person,"Ahmad");
خواندن مقدار:
string value =
property.GetValue(person).ToString();
بارگذاری اسمبلی در زمان اجرا
یکی از قابلیتهای مهم Reflection بارگذاری DLLها در Runtime است.
Assembly assembly =
Assembly.LoadFrom("Plugin.dll");
پس از بارگذاری میتوان کلاسهای موجود را بررسی کرد.
Type[] types =
assembly.GetTypes();
این ویژگی در سیستمهای افزونهای بسیار کاربرد دارد.
کاربرد Reflection در Pluginها
بسیاری از نرمافزارهای بزرگ از معماری Plugin استفاده میکنند.
در این مدل:
-
DLL جدید اضافه میشود.
-
برنامه DLL را شناسایی میکند.
-
کلاسهای مشخص پیدا میشوند.
-
متدها اجرا میگردند.
Reflection هسته اصلی چنین سیستمهایی است.
نمونهها:
-
Visual Studio Extensions
-
CMSها
-
ERPها
-
سیستمهای حسابداری
کاربرد Reflection در Dependency Injection
فریمورکهای DI مانند:
-
Microsoft DI
-
Autofac
-
Ninject
برای یافتن سرویسها و ایجاد اشیاء از Reflection استفاده میکنند.
این ابزارها کلاسها را بررسی کرده و وابستگیها را به صورت خودکار تزریق میکنند.
آیا به دنبال یک فرصت عالی برای یادگیری برنامهنویسی هستید؟ 🚀
با دوره آموزشی سیشارپ ما، شما میتوانید مهارتهای خود را به سطح جدیدی ارتقا دهید! این دوره بهطور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامهنویسی سیشارپ پیش بروید.
👨🏫 چرا دوره ما را انتخاب کنید؟
- محتوای جامع و عملی: با پروژههای واقعی و تمرینات عملی، یادگیری را به تجربهای جذاب تبدیل کنید.
- مدرس مجرب: از تجربه و دانش مدرس حرفهای بهرهمند شوید که شما را در هر مرحله از یادگیری راهنمایی میکنند.
- پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
- دسترسی مادامالعمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، میتوانید به آن مراجعه کنید.
💡 فرصت را از دست ندهید!
بایادگیری سیشارپ، میتوانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژههای جذاب و چالشبرانگیز شرکت کنید.
همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آیندهای روشنتر بردارید!
شرکت در دوره آموزش برنامه نویسی سی شارپ
کاربرد Reflection در ORMها
فریمورکهای ORM مانند:
Entity Framework
از Reflection برای نگاشت بین کلاسها و جداول پایگاه داده استفاده میکنند.
به کمک Reflection:
-
نام Propertyها خوانده میشود.
-
نوع دادهها استخراج میگردد.
-
عملیات CRUD تولید میشود.
کاربرد Reflection در Serialization
ابزارهای تبدیل داده به JSON یا XML نیز از Reflection استفاده میکنند.
نمونهها:
-
System.Text.Json
-
Newtonsoft.Json
این کتابخانهها Propertyهای کلاس را کشف کرده و آنها را به JSON تبدیل میکنند.
کاربرد Reflection در Unit Testing
فریمورکهای تست مانند:
- xUnit
- NUnit
با Reflection متدهایی را که دارای Attributeهای تست هستند شناسایی میکنند.
مثال:
[Test]
public void TestMethod()
{
}
فریمورک از طریق Reflection این متد را پیدا میکند.
Reflection و Attributeها
Reflection ارتباط نزدیکی با Attributeها دارد.
مثال:
[Obsolete]
public void OldMethod()
{
}
بررسی:
MethodInfo method =
typeof(MyClass)
.GetMethod("OldMethod");
object[] attrs =
method.GetCustomAttributes(false);
در نتیجه میتوان Attributeهای تعریف شده را استخراج کرد.
مزایای Reflection در سی شارپ
-
انعطافپذیری بالا
برنامه میتواند در زمان اجرا تصمیمگیری کند.
-
توسعهپذیری
افزودن قابلیتهای جدید بدون تغییر کد اصلی امکانپذیر است.
-
کاهش وابستگی
کلاسها کمتر به یکدیگر وابسته میشوند.
-
ساخت ابزارهای عمومی
بسیاری از فریمورکها و کتابخانهها بر پایه Reflection هستند.
-
کشف خودکار اجزاء
نیازی به ثبت دستی بسیاری از کلاسها وجود ندارد.
معایب Reflection در سی شارپ
با وجود مزایای فراوان، Reflection معایبی نیز دارد.
-
کاهش کارایی
Reflection نسبت به دسترسی مستقیم کندتر است.
مثال:
method.Invoke(...)
بسیار کندتر از:
calculator.Add(...)
اجرا میشود.
-
مصرف حافظه بیشتر
بررسی Metadataها باعث افزایش مصرف حافظه میشود.
-
دشواری اشکالزدایی
کدهای مبتنی بر Reflection پیچیدهتر هستند.
-
کاهش امنیت
در برخی شرایط امکان دسترسی به اعضای غیرعمومی وجود دارد که میتواند خطرات امنیتی ایجاد کند.
بهترین روشهای استفاده از Reflection
-
فقط در مواقع ضروری استفاده کنید
برای عملیات عادی بهتر است از فراخوانی مستقیم استفاده شود.
-
از Cache استفاده کنید
ذخیره اطلاعات Type و Method باعث افزایش سرعت میشود.
-
محدود کردن جستجو
به جای بررسی کل اسمبلی، محدوده جستجو را کاهش دهید.
-
مدیریت Exceptionها
همیشه عملیات Reflection را داخل بلوکهای Try-Catch قرار دهید.
مثال واقعی کاربرد Reflection در سی شارپ
فرض کنید یک سیستم گزارشگیری طراحی کردهاید که باید اطلاعات هر کلاس را به صورت خودکار نمایش دهد.
جای نوشتن کد جداگانه برای هر کلاس:
Customer
Product
Employee
Order
میتوان با Reflection تمامی Propertyها را استخراج و نمایش داد.
این روش باعث میشود با اضافه شدن کلاس جدید، نیازی به تغییر کد گزارشگیری نباشد.
جمعبندی
Reflection یکی از قدرتمندترین قابلیتهای زبان C# و پلتفرم .NET است که امکان بررسی و دستکاری ساختار برنامه را در زمان اجرا فراهم میکند.
با استفاده از Reflection میتوان اطلاعات اسمبلیها، کلاسها، متدها، ویژگیها و Attributeها را استخراج کرد، اشیاء را به صورت پویا ساخت و متدها را اجرا نمود.
این فناوری در توسعه فریمورکهای مدرن، سیستمهای افزونهای، Dependency Injection، ORMها، Serialization و ابزارهای تست نقش اساسی دارد.
هرچند Reflection انعطافپذیری بسیار بالایی ارائه میدهد، اما به دلیل تأثیر بر کارایی و پیچیدگی بیشتر، باید تنها در سناریوهایی که واقعاً به قابلیتهای پویا نیاز است مورد استفاده قرار گیرد.




کاربران ما
شما هم نظرتون با ما دریاره “کاربرد Reflection در سی شارپ” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید