(برنامه نویسی سی شارپ ) ایجاد یک کلاس Class Setting با کمک Reflection در زبان #C (مهندسی برق_ الکترونیک)

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

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

همزمان که setting جدیدی را بخواهید به مجموعه خود اضافه کنید، بایستی متدهای (Load) و (save) را جهت ذخیره کردن این تنظیمات جدید، به روزرسانی کنید. به وسیله Reflection انجام این کار بسیار ساده خواهد بود، setting مربوط به یک شخص را به جای setting یک نرم افزار ذخیره خواهیم کرد که خلاصه تر است. استفاده از Reflection ،نسبت به خواندن و نوشتن Properties به صورت دستی، کندتر بوده و بایستی تصمیم بگیرید از کدام روش در هر برنامه استفاده کنید. این مسئله زمانی که سرعت اجرای نرم افزار برایتان مهم است، یک فایل متنی file text برای مرتب سازی Sort چندین مقدار که با کاراکتر (/) از هم جدا شده اند، استفاده کرده ایم. اما در برنامه های واقعی، بهتر از ساختارهای مرتب دیتا مثل XML استفاده کنید. از سیستم مدیریت خطا در #C یا handling error استفاده نکرده ایم، در حالی که برای نرم افزارهای واقعی، مدیریت خطا حیاتی است.

public static List<THeader> ReadUpload850File<THeader, TItem>(ConfigTypeUploadXml uploadConfig, string fileNamePath, ref string errMsg)
     where THeader : new()
     where TItem : new()
{
    
    // we'll use reflections to add LineItems to data
    PropertyInfo[] properties = typeof(THeader).GetProperties();

    // read the file line by line
    List<THeader> data = new List<THeader>();
    int headIndex = 0;
    int lineIndex = 1;

    foreach (string line in File.ReadAllLines(fileNamePath))
    {
        // read HDR line
        if (line.StartsWith("HDR"))
        {
            THeader header = ReadHeaderLine<THeader>(uploadConfig, line, errMsg);
            data.Add(header);
            headIndex += 1;
        }

        // read LIN line
        if (line.StartsWith("LIN"))
        {
            TItem lineItem = ReadItemLine<TItem>(uploadConfig, line, errMsg);
            THeader header = data[data.Count - 1];
            PropertyInfo lineItemsProperty = header.GetType().GetProperty("LineItems");
            // Dim items As Object = lineItemsProperty.GetValue(header)
            // If items Is Nothing Then lineItemsProperty.SetValue(header, Nothing)
            IList lineItems = lineItemsProperty.GetValue(header) as IList;
if(lineItems == null) lineItems = new List<TItem>(); lineItems.Add(lineItem);
lineItemProperty.SetValue(header, lineItems) } lineIndex += 1; } return data; }

بار دیگر، از Reflection برای گرفتن خواص عمومی properties public از Class کلاس Person استفاده کرده ایم.کلاس Class Person را برای دریافت اطلاعات بیشتر گسترش دهید. خواص Properties جدیدی را به فایل اضافه کرده و مشاهده کنید که این اطلاعات جدید در فایل ذخیره و لود می شود.

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