关于winforms反思的问题

时间:2016-06-03 00:14:40

标签: c# winforms reflection

我有一个winforms应用程序。

我有一个Populate方法,可以在我的tabcontrol上的每个页面上创建一堆控件。 Populate方法有两个参数 - 标签页和带有一堆标签字符串的List。每个标签页都有一个单独的列表,列表的名称与标签页的名称相同。我想迭代遍历页面并按名称将适当的List传递给Populate方法,即通过名称的字符串传递List。据我所知,我需要反思。

代码:

namespace Test
{
    public partial class Form1 : Form
    {
        List<string> Hongdoe = new List<string>(new string[] { "Chin", "Foa", "Hu", "Dan" });
        List<string> Donfu = new List<string>(new string[] { "Faa", "Su", "Pi", "Mou" });
        //TabPage1.Name = Hongdoe
        //TabPage2.Name = Donfu
        foreach (TabPage tp in Tab_Control.TabPages)
        {
            //I want to tell the program "Find the variable/list that is named as 'tp.Name'
            var ListName = typeof(Form1).GetField(tp.Name)
            Populate(tp, ListName);
        }


    }

    void Populate (TabPage tp, List<string> list)
    {
        for (int i = 0; i < list.Count; i++)
        {
            //Create labels
            Label lab = new Label();
            lab.Text = list[i];
            lab.Location = new Point(i * 10, i * 10));
            tp.Controls.Add(lab);
        }
    }
}

但是它会返回null。我也尝试过使用“GetProperty”,“GetValue”但没有成功。

(在我编辑这个问题之前,我使用了一个变量来简单地演示我的问题)

1 个答案:

答案 0 :(得分:3)

您不需要使用反射。您可以使用Dictionary<string, List<string>>并使用列表名称(标签页名称)作为键和字符串列表作为值。然后,您可以使用字典中的密钥获取列表。

Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();
private void ProductList_Load(object sender, EventArgs e)
{
    //Initialize dictionary with keys and values
    dictionary["page1"] = new List<string> { "string 1", "string 2" };
    dictionary["page2"] = new List<string> { "string 3", "string 4" };
    //...
}

然后您可以通过这种方式调用Populate方法:

Populate(tp, dictionary[tp.Name]);

请注意

  • 您不需要将列表传递给方法,并且只需将TabPage传递给该方法,您就可以使用dictionary[tabPage.Name]获取列表

  • 您可以在标签页中使用TableLayoutPanelFlowLayoutPanel来添加标签。这样他们就会自动安排。

  • 如果您想使用反射,仅用于学习目的:

    var list = (List<string>)this.GetType().GetField("Hongdoe", 
        System.Reflection.BindingFlags.NonPublic |
        System.Reflection.BindingFlags.Instance).GetValue(this);