使用PropertyInfo导入控件属性的导出[]

时间:2019-07-18 07:50:12

标签: c# reflection

我的问题很简单。我正在使用Label控件。我在运行时创建了一个标签,然后使用PropertyInfo[]将其所有属性保存到文本文件。

现在,我再次想在运行时使用文件中的那些设置来重新创建此标签,但是它总是使某些设置(例如字体,大小和其他设置)出错。

请与我分享一个示例代码,其中

  1. 我可以在运行时创建标签

  2. 然后将其设置保存在文本文件中

  3. 然后从该文本文件重新创建它

    Label _lbl = new Label();
    Type t = typeof(Label);
    PropertyInfo[] propInfos = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
    foreach (PropertyInfo info in propInfos)
    {
      //exporting settings to file
    }

例如,当我导出字体属性时,它会像 “ [字体:名称= Tahoma,大小= 8.25,单位= 3,GdiCharSet = 1,GdiVerticalFont = False]”

在运行时,我使用以下代码进行设置。它给出了错误

_label.Font = (Font)Enum.Parse(typeof(Font), "[Font: Name=Tahoma, Size=8.25, Units=3, GdiCharSet=1, GdiVerticalFont=False]")

1 个答案:

答案 0 :(得分:0)

我建议以下内容:

首先,计划要保存的属性。例如

using System;
using System.Drawing;

namespace WindowsFormsApp10
{
    [Serializable]
    public class LabelProperties
    {
        public Font Font { get; set; }
        public Point Location { get; set; }
        public Size Size { get; set; }
        public string Text { get; set; }
    }
}

现在,我们可以为Label创建扩展方法,将这些属性保存到文件中并加载它们

using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Windows.Forms;

namespace WindowsFormsApp10
{
    static class LabelExtensions
    {
        static readonly BinaryFormatter binaryFormatter = new BinaryFormatter();

        internal static void SaveProperties(this Label label, string path)
        {
            var properties = new LabelProperties()
            {
                Font = label.Font,
                Location = label.Location,
                Size = label.Size,
                Text = label.Text
            };
            using (var stream = File.OpenWrite(path))
            {
                binaryFormatter.Serialize(stream, properties);
            }
        }

        internal static void LoadProperties(this Label label, string path)
        {
            using (var stream = File.OpenRead(path))
            {
                var properties = binaryFormatter.Deserialize(stream) as LabelProperties;
                label.Font = properties.Font;
                label.Location = properties.Location;
                label.Size = properties.Size;
                label.Text = properties.Text;
            }
        }
    }
}

现在我们可以将标签的属性保存到文件中,然后再将其重新加载

private void button1_Click(object sender, EventArgs e)
{
    var label = new Label()
    {
        Font = new Font("Times New Roman", 24, FontStyle.Italic),
        Location = new Point(100, 200),
        Text = "Example"
    };
    label.Size = label.GetPreferredSize(Size.Empty);

    string fileName = "label.bin";

    label.SaveProperties(fileName);

    var label2 = new Label();
    label2.LoadProperties(fileName);
    Controls.Add(label2);
}