【问题标题】:Getting a string to be a variable name获取字符串作为变量名
【发布时间】:2015-02-20 07:53:37
【问题描述】:

我发现了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() 是我不知道的事情。我什至不知道它会被称为搜索它。

【问题讨论】:

  • 你为什么不使用picDogs 的数组而不是4 个变量呢?那么您的代码将是dogs[i].PictureBox = picDog[i];
  • 你可以使用反射,但我认为这对你来说不是很好的解决方案
  • 谢谢大家。今晚我会试试这两个。 @YuriDorokhov 我将如何使用反射。你能给我看一些示例代码吗?
  • 请不要在这种情况下使用Reflection。这里有很多陷阱,例如如果在代码中重命名变量 picDog 会发生什么?在使用变量的任何地方都会出现compile time 错误,但Reflection 部分将在runtime 处失败,这更糟糕,更难追踪。
  • 我听说过属性。我听说过领域。但我从未听说过“财产领域”。你的意思是什么?

标签: c# winforms


【解决方案1】:

如果没有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 数组的元素之一。

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

【讨论】:

  • 非常感谢。对于我的下一个问题,我将坚持一个好的、最小的、完整的代码示例。谢谢你提出来。我不知道。
【解决方案2】:

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

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();

【讨论】:

    猜你喜欢
    • 2013-08-27
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    相关资源
    最近更新 更多