کار کردن با Reflection در سی شارپ

یکشنبه 21 مهر 1398

Reflection در سی شارپ دارای اهمیت بسیار زیادی است، ما در این مطلب قصد داریم کمی بیشتر درباره کار کردن با Reflection در سی شارپ صحبت کنیم.

 کار کردن با Reflection در سی شارپ

Reflection در سی شارپ برای بازیابی داده های متا بر روی انواع داده ها در زمان اجرا استفاده می شود، به عبارت دیگر می توان گفت که شما می توانید از Reflection در سی شارپ برای رسیدگی به داده های متای انواع مختلف داده ها به صورت داینامیک در برنامه های خود استفاده کنید. شما می توانید اطلاعات کدهای اسمبلی بارگذاری شده را همراه با نوع تعریف شده برای آنها بازگردانی کنید. Reflection در سی شارپ بسیار شبیه به RTTI در سی پلاس پلاس است. ما در این مطلب قصد داریم کمی بیشتر درباره Reflection در سی شارپ صحبت کنیم و اطلاعات جالبی را در خصوص این موضوع برای شما بیان کنیم. بنابراین ما را در این مطلب همراهی کنید.


مقدمه ای درباره Reflection در سی شارپ

برای کار کردن با Reflection در سی شارپ شما باید namespace مربوط به System.Reflection را به نرم افزار خود اضافه کنید. در هنگام استفاده از Reflection در سی شارپ شما اشیایی از نوع Type را دریافت می کنید که می توانید از آنها برای نمایش کدهای اسمبلی، انواع داده ها و ماژول ها استفاده کنید. شما می توانید از Reflection برای ساخت یک شی از نوع داینامیک استفاده کنید و حتی شما می توانید با استفاده از آن متدهای انواع داده ها را نیز فراخوانی کنید. انواع داده هایی که در System.Reflection تعریف می شوند شامل موارد زیر هستند:

Assembly، ماژول، Enum، اطلاعات متد، اطلاعات کانستراکتور، اطلاعات کاربر، اطلاعات پارامتر، نوع داده، اطلاعات فیلد، اطلاعات رویداد و اطلاعات پروتوتایپ.

اجازه دهید چند خطی کد بنویسیم تا بتوانیم از reflection در عمل نیز استفاده کنیم. کلاس زیر را که Customer نامیده ایم را در نظر بگیرید:

public class Customer


    {


        public int Id

{


            get; set;


        }


        public string FirstName


        {


            get; set;


        }


        public string LastName


        {


            get; set;


        }


        public string Address


        {


            get; set;


        }


    }


 Reflection در سی شارپ


دریافت نام کلاس و برخی از مشخصات دیگر

قطعه کد زیر به شما نشان می دهد که چگونه می توانید نام کلاس و نام namespace را از کلاس Customer دریافت کنید.

Type type = typeof(Customer);


Console.WriteLine("Class: " + type.Name);


Console.WriteLine("Namespace: " + type.Namespace)

;

کد زیر نیز به شما نشان می دهد که چگونه می توانید لیستی از ویژگی ها و مشخصات کلاس Customer را بازگردانی کنید و نام آنها را در پنجره کنسول نمایش دهید:

static void Main(string[] args)


        {


            Type type = typeof(Customer);


            PropertyInfo[] propertyInfo = type.GetProperties();


            Console.WriteLine("The list of properties of the Customer class are:--");


            foreach (PropertyInfo pInfo in propertyInfo)


            {


                Console.WriteLine(pInfo.Name);


            }


        }

 Reflection در سی شارپ


نکاتی در خصوص کد بالا

متد GetProperties() که از نوع کلاس است، آرایه ای از نوع PropertyInfo را باز می گرداند( این لیست در واقع یک لیست از ویژگی های پابلیک از نوع داده های شما است). بعد از آن شما می توانید با یک لوپ بر روی این آرایه نام هر یک از مشخصات پابلیک که به عنوان نوع داده ای خود انتخاب کرده اید را دریافت کنید. از آنجایی که کلاس Customer سه ویژگی را تعریف می کند نام های هر یک از این سه ویژگی می تواند در زمان اجرای برنامه در کنسول نمایش داده شود.

 Reflection در سی شارپ


نمایش داده های متا

در اینجا قصد داریم به شما نشان دهیم چگونه می توانید داده های متای کانستراکتورها و متدهای پابلیک که از نوعی هستند که در زمان استفاده از Reflection در سی شارپ تعریف کرده اید را نمایش دهید. اجازه دهید دوباره نگاهی به کلاس Customer که قبلا آن را ساخته ایم داشته باشیم و دو متد را در این کلاس تعریف کنیم( یک کانستراکتور پیش فرض و یک متد که Validate نامگذاری می شود که برای اعتبارسنجی شی کاستومر به عنوان پارامتر به این کلاس ارسال می شود، مورد استفاده قرار می گیرد). در واقع این همان چیزی است که این کلاس قرار است تبدیل به آن شود.

public class Customer


    {


        public Customer()


        {


            //Default constructor


        }


        public int Id


        {


            get; set;


        }


        public string FirstName


        {


            get; set;


        }


        public string LastName


        {


            get; set;


        }


        public string Address


        {


            get; set;


        }


        public bool Validate(Customer customerObj)


        {


            //Code to validate the customer object


            return true;


        }

    قطعه کد زیر می تواند برای نمایش نام های تمامی کانستراکتورهایی که به کلاس کاستومر متعلق هستند مورد استفاده قرار گیرد. ما در حال حاضر تنها یک کانستراکتور در کلاس کاستومر داریم بنابراین تنها یک نام در این لیست خواهد بود.

Type type = typeof(Customer);           


ConstructorInfo[] constructorInfo = type.Get Constructors();


Console.WriteLine("The Customer class contains the following Constructors:--");


foreach (ConstructorInfo c in constructorInfo)


  {


     Console.WriteLine(c);


  }

 Reflection در سی شارپ


یک نکته بسیار مهم درباره Reflection در سی شارپ

توجه داشته باشید که متد Get Constructors() که از نوع کلاس است یک آرایه از نوع ConstructorInfo باز می گرداند که شامل لیستی از تمامی کانستراکتورهای پابلیک است که به عنوان نوع داده ای شما در هنگام شروع کار با Reflection تعریف شده اند.

اجازه دهید نام تمامی متدهای پابلیک کلاس کاستومر را نمایش دهیم( برای بار دوم فراموش نکنید که ما در اینجا تنها یک متد پابلیک داریم، بنابراین در هنگام نمایش در زمان اجرای برنامه ما این نام ها تنها یک نام به ما نشان داده خواهد شد). در اینجا قطعه کدی که برای انجام این کار در حین کار کردن با Reflection در سی شارپ باید استفاده کنید را برای شما آورده ایم:

static void Main(string[] args)


 {


    Type type = typeof(Customer);


    MethodInfo[] methodInfo = type.GetMethods();


     Console.WriteLine("The methods of the Customer class are:--");


            foreach (MethodInfo temp in methodInfo)


            {


              Console.WriteLine(temp.Name);               


            }


            Console.Read();


        }


 Reflection در سی شارپ


جمع بندی و نکات پایانی

توجه داشته باشید که شما ممکن است نام برخی از متدهای دیگر را نیز دریافت کنید( به عنوان مثال toString، Equals، GetHashCode و GetType) که تمامی آنها در این بخش نمایش داده خواهند شد. این متدها در واقع از کلاس Object ارث بری شده اند( هر کلاسی در .NET از کلاس Object به صورت پیش فرض ارث بری می شود).

نکته دیگری که وجود دارد این است که شما می توانید بر روی ویژگی های متد خود نیز از حلقه استفاده کنید، اگر ویژگی های شخصی سازی شده برای متدهای شما تعریف شده باشند شما می توانید از متد Get CustomAttributes بر روی یک شی از کلاس MethodInfo استفاده کنید تا با استفاده از آن ویژگی های متد خود را بازگردانی کنید. در ادامه نحوه انجام این کار را در حین استفاده از Reflection در سی شارپ برای شما بیان کرده ایم.

foreach (MethodInfo temp in methodInfo)


 {


    foreach (Attribute attribute in temp.GetCustomAttributes(true))


     {


         //Write your usual code here


     }


  }

بنابراین اگر برای طراحی اشیا تجاری خود از ویژگی هایی در برنامه خود استفاده می کنید شما می توانید از مزایای استفاده از Reflection در سی شارپ برای کار کردن با نوع داده دلخواه خود بهره مند شوید، علاوه بر این شما می توانید ویژگی های متدهایی که از نوع داده ای دلخواه شما هستند را بازگردانی کرده و برخی از اعمال را بر روی آنها انجام دهید.

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان
  • C#.net
  • 4k بازدید
  • 3 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید