迭代特定的控件属性c#

时间:2014-02-03 12:22:34

标签: c#

我需要遍历特定的控件属性并保存该控件的属性名称& xml文件中的值。我写了几行,但收到​​错误。

private void SaveStyle()
{
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    XmlWriter writer = XmlWriter.Create(Application.ExecutablePath+ @"\Products.xml", settings);

    PropertyInfo[] properties = metroStyleManager1.GetType().GetProperties();
    writer.WriteStartDocument();
    foreach (PropertyInfo pi in properties)
    {
        writer.WriteElementString(pi.Name,pi.GetValue(((object)metroStyleManager1),null));
    }
}

此行提供错误writer.WriteElementString(pi.Name,pi.GetValue(((object)metroStyleManager1),null));

我需要做的下一个问题我必须从xml文件中读回控件属性数据,并根据控件名称设置值。我不清楚如何做到这一点。所以请帮忙。感谢

更新

我保存控件属性的完整代码&回读一下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Xml;
using MetroFramework;
namespace CSRAssistant
{
    class Utils
    {
        public static void SaveProperty(System.ComponentModel.Component _Control)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + @"\Products.xml", settings);

            PropertyInfo[] properties = _Control.GetType().GetProperties();
            writer.WriteStartElement("metroStyleManager");
            foreach (PropertyInfo pi in properties)
            {
                writer.WriteElementString(pi.Name, Convert.ToString(pi.GetValue(_Control, null)));
            }
            writer.WriteEndDocument();

            writer.Flush();
            writer.Close();
        }

       public static void ReadProperty(System.ComponentModel.Component _Control)
    {
        string _property = "", _value = "";
        if (System.IO.File.Exists(System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + @"\Products.xml"))
        {
            XmlReader rdr = XmlReader.Create(System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + @"\Products.xml");
            while (rdr.Read())
            {
                if (rdr.NodeType == XmlNodeType.Element)
                {
                    if (rdr.LocalName.ToUpper() != "METROSTYLEMANAGER")
                    {
                        _property = rdr.LocalName;
                        _value = rdr.ReadInnerXml();
                        if (_property.ToUpper() == "STYLE")
                            ((MetroFramework.Components.MetroStyleManager)_Control).Style = (MetroColorStyle)Enum.Parse(typeof(MetroColorStyle), _value);
                        if (_property.ToUpper() == "THEME")
                            ((MetroFramework.Components.MetroStyleManager)_Control).Theme = (MetroThemeStyle)Enum.Parse(typeof(MetroThemeStyle), _value);
                        //else
                        //    _Control.GetType().GetProperty(_property).SetValue(_Control, _value, null);
                    }
                }
            }

            rdr.Close();
        }
    }

    }
}

2 个答案:

答案 0 :(得分:1)

writer.WriteElementString(string localName, string value)

需要两个字符串参数。但pi.GetValue()会返回object类型的值。您需要将第二个参数转换为字符串:

Convert.ToString(pi.GetValue(metroStyleManager1))

这将检查object的值是否为null,如果value为null则返回空字符串。它还将检查对象是否实现IConvertible或IFormattable接口并调用适当的ToString()方法。

答案 1 :(得分:0)

确切的错误肯定会有所帮助,但我猜您的问题是WriteElementString方法,该方法需要两个字符串参数。

另一方面,

PropertyInfo.GetValue返回一个对象。您必须将object转换为string。如果它不是.ToString(),可能的方法是在null上调用foreach (PropertyInfo pi in properties) { object obj = pi.GetValue(metroStyleManager1, null); writer.WriteElementString(pi.Name, obj != null ? obj.ToString() : String.Empty); } ,如果是,则使用空字符串。


{{1}}