Использование отражения для загрузки значений из XML в структуру - PullRequest
0 голосов
/ 12 июля 2020

Я использую Reflection для загрузки некоторых значений из XML в структуру. Все работает, но у меня проблема с управлением массивом. С Int32 все в порядке, но как я могу управлять Int32 []?

РЕДАКТИРОВАТЬ: Вот мой код ... он не завершен из-за длины ... Я хочу улучшить сохранение и загрузку для массива типы.

    //My struct ... it should be a class too
    
    public struct stOptions
    {
        public int IntNumber;
        public double DoubleNumber;
        public string String;
        public Point aPoint;
    }

    //How my class works
    
    private void Form1_Load(object sender, EventArgs e)
    {
        stOptions options = new stOptions();
        //Populate the struct  
        options.aPoint = new Point(12, 24);
        options.DoubleNumber = 34d;
        options.IntNumber = 17;
        options.String = "Hello";

        ManageSettings ms = new ManageSettings();

        ms.SaveSettings("e:\\test001.xml", options);

        options = default(stOptions);

        options = ms.LoadSettings<stOptions>("e:\\test001.xml");
    }

    //A portion of my class

    public T LoadSettings<T>(string FileName)
    {
        Type type = typeof(T);
        var returnObject = Activator.CreateInstance(type);
        List<Settings> list = null;

        try
        {
            using (StreamReader reader = File.OpenText(FileName))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(List<Settings>));
                list = (List<Settings>)serializer.Deserialize(reader);
            }
        }
        catch
        {
            //Error accessing the file
            _errors.Add("Unable to locate the file or access denied: " + FileName);
            return default(T);
        }

        try
        {
            foreach (Settings entry in list)
            {
                FieldInfo field = returnObject.GetType().GetField(entry.Key.ToString());
                if (field != null)
                {
                    SetField(field, entry.Value.ToString(), returnObject);
                }
                field = null;

                PropertyInfo prop = returnObject.GetType().GetProperty(entry.Key.ToString());
                if (prop != null)
                {
                    SetField(prop, entry.Value.ToString(), returnObject);
                }
                prop = null;
            }
            list = null;
        }
        catch
        {
            //Error processing the XML
            _errors.Add("Errore processing the XML file: " + FileName);
            return default(T);
        }
        return (T)returnObject;
    }
    
    private void SetField(FieldInfo prop, string value, object returnObject)
    {
        switch (prop.FieldType.Name.ToLower())
        {
            case "uint16":
                prop.SetValue(returnObject, Convert.ToUInt16(value));
                break;

            case "uint32":
                prop.SetValue(returnObject, Convert.ToUInt32(value));
                break;
                
            etc.
            [...]
            
            default:
                //An unmanaged type
                Debug.WriteLine("Found an unmanaged type: " + prop.FieldType.Name);
                break;
        }
    }

Когда он будет завершен, я опубликую sh его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...