Динамическое создание объектов в цикле
У меня есть массив строк, которые я просматриваю. Я хотел бы пройти через массив и на каждой итерации создать новый объект с именем, которое соответствует строковому значению.
Например:
string[] array = new string[] { "one", "two", "three" };
class myClass(){
public myClass(){
}
}
foreach (string name in array)
{
myClass *value of name here* = new myClass();
}
Приведёт к созданию трех объектов с именами "один", "два" и "три".
Возможно ли это или есть лучшее решение?
Ответы
Ответ 1
То, что вы пытаетесь сделать, невозможно в статически типизированном языке. IIRC, это возможно на PHP, но это не рекомендуется.
Вместо этого используйте словарь: http://ideone.com/vChWD
using System;
using System.Collections.Generic;
class myClass{
public string Name { get; set; }
public myClass(){
}
}
class MainClass
{
public static void Main()
{
string[] array = new string[] { "one", "two", "three" };
IDictionary<string,myClass> col= new Dictionary<string,myClass>();
foreach (string name in array)
{
col[name] = new myClass { Name = "hahah " + name + "!"};
}
foreach(var x in col.Values)
{
Console.WriteLine(x.Name);
}
Console.WriteLine("Test");
Console.WriteLine(col["two"].Name);
}
}
Выход:
hahah one!
hahah two!
hahah three!
Test
hahah two!
Ответ 2
В то время как другие дали вам альтернативу, но никто не говорит, почему они рекомендуют вам это.
Это потому, что Вы не можете получить доступ к объекту с динамическими именами.
( Пища для размышлений. Подумайте на мгновение, если вы сможете это сделать, как вы получите к ним доступ, прежде чем они будут даже закодированы/названы.)
Вместо этого создайте Dictionary<string, myClass>
, как упоминалось выше.
Ответ 3
Используйте Dictionary<String, myClass>
:
var dict= new Dictionary<String, myClass>();
foreach (string name in array)
{
dict.Add(name, new myClass());
}
Теперь вы можете получить доступ к экземплярам myClass
по вашим именам:
var one = dict["one"];
или в цикле:
foreach (string name in array)
{
myClass m = dict[ name ];
}
Ответ 4
Вы можете использовать этот подход:
var array = [srt1, srt2, str3];
var other_array = [];
for(var i = 0; i < array.length; i++){
other_array.push({
name: array[i]
})
}
И для поиска легко найти нужный вам экземпляр с помощью фильтрации:
var instance1 = other_array.filter(function(result) {
return result.name == 'str1';
});
Ответ 5
Похоже, вам нужен список словарей ваших объектов:
var myClassDictionary = new Dictionary<string,myClass>();
foreach (string name in array)
{
myClassDicationry.Add(name, new myClass());
}
// usage:
// myClass["one"] <- an instance of myClass
Нет языков программирования, о которых я знаю, которые позволяют определять имена переменных во время выполнения.
Ответ 6
Вы можете сделать что-то вроде этого -
Dictionary<string, myClass> classes = new Dictionary<string, myClass>();
foreach(string name in array)
{
classes[name] = new myClass();
}
Затем вы можете обратиться к именованным экземплярам позже
classes[name].MyClassMethod();
Ответ 7
Вы можете использовать следующий код.
string[] array = new string[] { "one", "two", "three" };
Dictionary<String, myClass> list;
class myClass(){
public myClass(){
list = new Dictionary<String, myClass>();
}
}
foreach (string name in array)
{
list.Add(name, new myClass())
}
Ответ 8
Вы можете использовать списки для хранения объектов, чтобы вы могли получить к ним доступ.
list<myClass> myClasses = new List<myClass>();
foreach (myClass object in myClasses)
{
//preform interaction with your classes here
}
Ответ 9
Неприменимо к С# или любому статически типизированному языку в этом отношении.
Для любопытства я попытался, если то, что я запомнил в PHP (создание переменных на лету), по-прежнему правильно.
Это все тот же PHP, последний раз, когда я использовал его, это был год 2000. Вы можете генерировать переменные на лету, не говоря о том, что это целесообразно, хотя это загрязняет глобальные переменные, это может повредить некоторую существующую переменную или объект с тем же именем.
https://ideone.com/nJDiou
<?php
class MyClass
{
private $v;
function __construct($x) {
$this->v = $x;
}
public function getValue() {
return $this->v;
}
}
$one = new MyClass("I'm tough!");
echo "The one: " . $one->getValue() . "\n";
$i = 0;
foreach(array("one","two","three") as $h) {
$$h = new MyClass("Says who? " . ++$i);
}
echo "The one: " . $one->getValue() . "\n";
echo $two->getValue() . "\n";
echo $three->getValue() . "\n";
echo "loop\n";
foreach(array("three","one","two") as $h) {
echo $$h->getValue() . "\n";
}
?>
Выходы:
The one: I'm tough!
The one: Says who? 1
Says who? 2
Says who? 3
loop
Says who? 3
Says who? 1
Says who? 2