获取字符串作为变量名称

时间:2015-02-19 17:01:47

标签: c# winforms

我发现了this问题,但它与XML文件一起使用,所以我不太了解发生了什么。

我想要做的是获取我的for循环中填充的对象列表。现在我有这个:

for (int i = 0; i < dogs.Length; i++)
{
    dogs[i] = new Dog();
}
dogs[0].PictureBox = picDog0;
dogs[1].PictureBox = picDog1;
dogs[2].PictureBox = picDog2;
dogs[3].PictureBox = picDog3;

我想做这样的事情:

for (int i = 0; i < dogs.Length; i++)
{
    dogs[i] = new Dog();
    dogs[i].PictureBox = StringToVariable("picDog" + i); 
}

PictureBox是一个属性字段,以防万一。

StringToVariable()是我不了解的事情。我甚至不知道要搜索它会被叫什么。

2 个答案:

答案 0 :(得分:2)

没有a good, minimal, complete code example,我们无法肯定地说。但我希望以下陈述适用于您的场景:

dogs[i].PictureBox = (PictureBox)Controls.Find("picDog" + i, true)[0];

那将依次为每个控件搜索当前控件的子节点(我假设在这种情况下是你的Form子类)。这有点低效,因为它必须搜索每个项目的控件集合,但只要您的项目数量相对较少,这可能不是问题。

根据Form的设置方式,以下内容也可能有效:

string prefix = "picDog";

foreach (PictureBox pictureBox in Controls.OfType<PictureBox>())
{
    if (pictureBox.Name.StartsWith(prefix))
    {
        int index;

        if (int.TryParse(pictureBox.Name.Substring(prefix.Length), out index))
        {
            dogs[index] = pictureBox;
        }
    }
}

该版本只检查每个子控件一次,尝试解析附加到"picDog"初始文本的索引,如果成功,则使用该索引直接分配给您的数组。这样做的好处是可以很好地扩展到更大的控件列表,但在你的情况下可能有点过分。

请注意,在上述两个示例中,我都遗漏了任何错误检查。在任何一个示例中,您可能希望添加某种处理以防万一(对于第一个示例)无法找到所需的控件,或者(对于第二个示例)如果找到无法解析的控件索引,或者无法填写dogs数组的其中一个元素。

如果由于某些原因上述示例似乎都不适合您,请编辑您的帖子,以便它包含更好的代码示例。

答案 1 :(得分:1)

有时一个简单的解决方案可以很好地运作。怎么样?

var picDogs = new [] { picDog0, picDog1, picDog2, picDog3 };
for (int i = 0; i < dogs.Length; i++)
{
    dogs[i] = new Dog();
    dogs[i].PictureBox = picDogs[i]; 
}

你甚至可以这样做:

var dogs = new [] { picDog0, picDog1, picDog2, picDog3 }
    .Select(picDog => new Dog() { PictureBox = picDog })
    .ToArray();