如何按名称获取列表

How do I get a List by name

本质上,我想做的是将控件添加到相应的列表 "row"+行,(无论行号在 for 循环中是什么),但是,我不能似乎找到了一种通过字符串获取列表引用的方法。我想知道是否有办法做到这一点。

    List<PictureBox> row1 = new List<PictureBox>();
    List<PictureBox> row2 = new List<PictureBox>();
    List<PictureBox> row3 = new List<PictureBox>();
    List<PictureBox> row4 = new List<PictureBox>();
    List<PictureBox> row5 = new List<PictureBox>();
    List<PictureBox> row6 = new List<PictureBox>();
    List<PictureBox> row7 = new List<PictureBox>();
private void fillLists()
    {
        for (int col = 1; col < 7; col++)
        {
            for (int row = 1; row < 6; row++)
            {
                string name = "row_"+row+"_col_"+col;

                PictureBox picture = (PictureBox)this.Controls[name];

                // "row"+row.Add(picture);

            }
        }
    }

编辑 1 - 添加了这个,看看它是否有效。谢谢大家的帮助!

private void fillLists()
    {
        for (int col = 1; col < 7; col++)
        {
            for (int row = 1; row < 6; row++)
            {
                string name = "row_" + row + "_col_" + col;
                if (!rows.ContainsKey(row))
                {
                    rows.Add(row, new List<PictureBox>());
                }

                rows[row].Add((PictureBox)this.Controls[name]);
            }


        }

使用字典来组合你所有的 collections:

var dict = new Dictionary<string, List<PictureBox>> 
for(int i = 1; i < 8; i++)
{
    dict.Add("row"+i, new List<PictureBox>);
}

然后通过以下方式访问它:

dict["row1"].Add(....);

既然你想知道怎么做,这里是如何使用反射来完成的:

class Program
{
    List<object> myList1 = new List<object>();
    List<object> myList2 = new List<object>();
    List<object> myList3 = new List<object>();
    List<object> myList4 = new List<object>();
    List<object> myList5 = new List<object>();
    List<object> myList6 = new List<object>();

    static void Main(string[] args)
    {
        Program p = new Program();
        p.Run();

        Console.ReadLine();
    }

    void Run()
    {
        for (int i = 1; i <= 6; i++)
        {
            FieldInfo field = this.GetType().GetField("myList" + i, BindingFlags.NonPublic | BindingFlags.Instance);
            if (field != null)
            {
                List<object> value = field.GetValue(this) as List<object>;

                if (value != null)
                {
                     //You can use it here
                }
                else
                {
                     //Wasn't found
                }
            }
        }
    }
}

请注意,这比仅将列表添加到字典并使用命名索引要慢得多。它确实演示了如何获取该字段,但这是一个控制台程序,可以 copy/pasted 到任何新的控制台项目中。