【问题标题】:Is it possible to instantiate objects with variable names, or access variable names at runtime?是否可以用变量名实例化对象,或在运行时访问变量名?
【发布时间】:2011-10-24 18:48:41
【问题描述】:

我有相当多的代码行来创建对象并使用具有相似对象名称和构造函数的各种参数。唯一改变的是正在创建的对象变量的实际名称,以及传入的对象本身的名称。下面是一个与我当前设置匹配的代码示例:

BackyardObject backyardObject0 = new BackyardObject(cat0, dog0, goat0, piglet0);
BackyardObject backyardObject1 = new BackyardObject(cat1, dog1, goat1, piglet1);
BackyardObject backyardObject2 = new BackyardObject(cat2, dog2, goat2, piglet2);
BackyardObject backyardObject3 = new BackyardObject(cat3, dog3, goat3, piglet3);
BackyardObject backyardObject4 = new BackyardObject(cat4, dog4, goat4, piglet4);
// many many more BackyardObjects being instantiated

正如我们所见,正在创建的对象的名称与传递给构造函数的对象的名称完全匹配。是否可以创建一个循环来设置所有这些?

编辑

我想我可能缺少获得此问题正确答案所需的详细信息。这不是关于“如何”使用循环或如何将项目添加到集合中的问题,更多的是确定是否可以在循环内动态创建“变量名”,同时访问循环内部动态的另一个变量名提供了上面给出的信息(只是现场编写的代码)。

// psuedo code for something I'm asking is possible
for( i = 0; i < 10; i++)
{
    // create BackyardObject with generic name, while appending "i" to 
    // variable name, and accessing other object variables
    BackyardObject backyardObject'i' 
        = new backyardObject(cat'i', dog'i', goat'i', piglet'i');
}

虽然我知道我可以创建额外的数组和列表来存储对象然后使用它们,但我只是想看看是否可以动态获取变量名。我不确定这是否完全可能,这就是我问这个问题的原因。我知道这是一个奇怪的问题,但是在我看到这段 Objective-C 代码后很好奇:

// Getting an arrayName dynamically based on loop index
for (int i = 0; i < 10; i++)
{
    NSString *arrayName = [[NSString alloc] initWithFormat:@"column%d",
        i];
    NSArray *array = [self valueForKey:arrayName];
}

【问题讨论】:

  • 称为数组。使用它。
  • 是的。这个问题的重要部分是数据是如何存储的,而不是你如何构建BackyardObjects。那么...您如何解决catXdogXgoatXpigletX
  • 你需要看一个基本的控制流教程。循环对于即使是最简单的任务也至关重要,并且至少在基本层面上可以理解。
  • 我很抱歉一开始没有提供更多信息,但请参阅上面问题的编辑。这不是如何使用循环等。

标签: c# for-loop runtime


【解决方案1】:

对象没有名字……你说的是变量。与其使用大量带有数字作为后缀的变量,不如使用 collections - 数组、列表或其他任何东西。然后你可以这样做:

// Or use arrays...
List<Cat> cats = new List<Cat>();
cats.Add(new Cat(...)); // Add the cats however you want to set them up
// Ditto dogs, goats etc

List<BackyardObject> backyardObjects = new List<BackyardObject>();
for (int i = 0; i < 10; i++)
{
    backyardObjects.Add(new BackyardObject(cats[i], dogs[i],
                                           goats[i], piglets[i]));
}

我假设您是 C# 的新手 - 我建议您在学习的任何内容中查看数组和集合。

【讨论】:

  • 在这种情况下,您还需要拥有 cat、dogs、goats 和 piglets 数组/列表,以便引用它们并将它们传递给 const。类的。
  • 虽然对 C# 一点也不陌生,但我知道我可以创建集合,如列表、数组等,如您所说,只需使用一个非常简单的 for 循环。我已经更新了我的问题,并希望更清楚我所问的问题是可能的。我假设没有,但最近在 Objective-C 代码中看到了一些东西,并且想知道 C# 中是否有类似的东西。谢谢!
  • @HansGruber:你可以通过反射来做到这一点——但这根本不是惯用的。您将这些变量以数字作为后缀这一事实表明您已经将它们考虑作为一个集合——那么为什么您没有使用一个集合呢?拥有单独变量的优势在哪里?像这样动态使用名称并不是解决问题的正常 C# 方式,IMO。
  • @JonSkeet:是的,如果可能的话,这更像是一个问题,我只是好奇地在 Objective-C 中看到了一些我在看书中的代码时不知道可能的东西.处理这个问题的最佳方法是什么,因为它有答案,所以不能被删除?这显然不是一个很有帮助的,或者其他人可能会使用的。
  • @HansGruber:我不知道——确实有人问过这种事情。我认为它不会造成重大伤害......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多