(برنامه نویسی سی شارپ) آموزش Reflection در زبان #C (مهندسی برق _ الکترونیک)
پژوهشگر و نویسنده: (  افشین رشید )
نکته: در عمل برنامه نویسی کامپیوتر، مفهوم "reflection به وسیله ای گفته می شود که در آن، برنامه کامپیوتری می تواند رفتار خود را مشاهده کرده و در صورت نیاز ساختار و عملکرد خود را تغییر دهید.
تعریف فوق، حالتی است که دقیقا #C مطابق آن عمل می کند. البته اگر بتوانید این موضوع را در کد نویسی خود به خوبی درک کنید، قابلیت امتحان کردن و تغییر اطلاعات برنامه تان در هنگام اجرا، پتانسیل و نیروی فوق العاده ای را در اختیار شما قرار می دهد. استفاده از Reflection به معنای واقعی کلمه، در زبان #C ، بسیار ساده و کاربردی است.
public static List<H> ReadFile<H, I>(ConfigTypeUploadXml uploadConfig, string fileNamePath, ref string errMsg) where H : new() where I : new()
{
    // we'll use reflections to add LineItems to data
    var properties = typeof(H).GetProperties();

    // read the file line by line and add to data. 
    var data = new List<H>();
    var headIndex = 0;
    var lineIndex = 1;

    foreach (string line in File.ReadAllLines(fileNamePath))
    {

        // read HDR line
        if (line.StartsWith("HDR"))
        {
            var header = ReadHeaderLine<H>(uploadConfig, line, errMsg);
            data.Add(header);
            headIndex += 1;
        }

        // read LIN line
        if (line.StartsWith("LIN"))
        {
            var lineItem = ReadItemLine<I>(uploadConfig, line, errMsg);

            foreach (PropertyInfo p in properties)
            {
                if (p.Name != "LineItems")
                    continue;

                //1) if items is null then create the object
                List<I> items = p.GetValue(data[headIndex - 1], null);
                if (items == null)
                    p.SetValue(data[headIndex - 1], new List<I>());
					
		//2) add line item to data[headIndex - 1]
				
            }
        }

        lineIndex += 1;
    }

    return data;
}


در مثال فوق از متد (GetType) برای عمل برای دو متغیر مورد نظر خود و از متد (typeof) برای کار با کلاس class شناخته شده Int32 استفاده کرده ایم، خروجی اجرای هر دو متد اشاره شده، یک TypeObject است، که به راحتی می توان مقدار خاصیت Property FullName آن را خواند. در برخی موارد، ممکن است فقط نام نوع یا type ای که به دنبال آن هستید، را بدانید. در چنین موردی، بایستی یک رفرنس را از طریق یک اسمبلی مناسب به type مورد نظر ایجاد نمایید. نام دو کلاس Class تعریف شده در اسمبلی یعنی کلاس Program و کلاس Duming Class است. اما در پروژه های بزرگتر، خروجی های لیست کامل تمامی Class کلاس های پروژه خواهد بود.

پژوهشگر و نویسنده:  دکتر (  افشین رشید )