اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
یک دقیقه
یک از ابتداییترین مواردی که در یادگیری دات نت آموزش داده میشود مباحث مربوط به کپسوله سازی است. برای مثال فیلدها و خواص Private که به صورت خصوصی هستند یا Protected هستند از خارج کلاس قابل دسترسی نیستند. برای دسترسی به این کلاسها باید از خواص یا متدهای عمومی استفاده کرد.
یا فیلدها و خواصی که به صورت فقط خواندنی هستند،(RealOnly) امکان تغییر مقدار برای اونها وجود ندارد. برای مثال کد پایین کامپایل نخواهد شد.
اما در دات نت با استفاده از Reflectionها میتونیم تمام قوانین بالا رو نادیده بگیریم. یعنی میتونیم هم به خواص و فیلدهای غیر عمومی کلاس دسترسی پیدا کنیم و هم میتونیم مقدار فیلدهای فقط خواندنی رو تغییر بدیم. به مثالهای زیر دقت کنید.
#مثال اول
ابتدا یک کلاس که دارای یک متغیر به نام کد است ساخته ایم که مقدار 10 را دارد. فیلد به صورت private است. بعد از اجرا به راحتی مقدار Code را به دست میآوریم.
حتی امکان تغییر مقدار فیلد private هم امکان پذیر است.
#مثال دوم.
در این مثال قصد داریم مقدار یک فیلد، از نوع فقط خواندنی رو تغییر دهیم.
بعد از اجرا مقدار متغیر code به 50 تغییر مییابد.
public class Book { private int code = 10; public int GetCode() { return code; } }
public class Book { private readonly int code = 10; public int GetCode() { return code = 20; } }
#مثال اول
using System.Reflection; public class Book { private int code = 10; } public class Program { static void Main( string[] args ) { Book book = new Book(); var codeField = book.GetType().GetField( "code", BindingFlags.NonPublic | BindingFlags.Instance ); codeField.SetValue( book, 20 ); var value = codeField.GetValue( book ); } }
حتی امکان تغییر مقدار فیلد private هم امکان پذیر است.
#مثال دوم.
در این مثال قصد داریم مقدار یک فیلد، از نوع فقط خواندنی رو تغییر دهیم.
using System.Reflection; public class Book { private readonly int code = 10; } public class Program { static void Main( string[] args ) { Book book = new Book(); var codeField = book.GetType().GetField( "code", BindingFlags.NonPublic | BindingFlags.Instance ); codeField.SetValue( book, 50); var value = codeField.GetValue( book ); } }