2012-06-07 3 views
9

У меня есть массив строк, которые я просматриваю. Я хотел бы пройти через массив и на каждой итерации создать новый объект с именем, которое соответствует строковому значению.Динамическое создание объектов в цикле

Например,

string[] array = new string[] { "one", "two", "three" }; 

class myClass(){ 

    public myClass(){ 
    } 
} 

foreach (string name in array) 
{ 
    myClass *value of name here* = new myClass(); 
} 

В результате будут созданы три объекта с именами «один», «два» и «три».

Возможно ли это или есть лучшее решение?

+0

Почему вы должны сделать это? Не можете ли вы поместить экземпляры классов в массив или, возможно, в словарь ? – Joshua

ответ

10

Что вы пытаетесь сделать, это не представляется возможным в статически типизированных языках. 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! 
+0

Спасибо, что также демонстрирует, как получить доступ к свойствам каждого объекта также :) – user469453

4

В то время как другие дали вам альтернативу, но никто не говорит, почему они рекомендуют вам это.

Это потому, что Вы не можете получить доступ к объекту с динамическими именами.

(Пища для размышлений: Просто подумайте на минуту, если вы могли бы сделать так, как вы к ним доступ, прежде чем они даже закодированы/имени.)

Вместо создания Dictionary<string, myClass>, как другие упомянутые.

4

Используйте 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 ]; 
} 
0

Похоже, что вам нужно список словарей ваших объектов:

var myClassDictionary = new Dictionary<string,myClass>(); 

foreach (string name in array) 
{ 
    myClassDicationry.Add(name, new myClass()); 
} 

// usage: 
// myClass["one"] <- an instance of myClass 

Нет языков программирования, о которых я знаю, что позволяет определять имена переменных во время выполнения.

0

Вы могли бы сделать что-то вроде этого -

Dictionary<string, myClass> classes = new Dictionary<string, myClass>(); 

foreach(string name in array) 
{ 
    classes[name] = new myClass(); 
} 

Затем вы можете обратиться к именованным экземплярам позже

classes[name].MyClassMethod(); 
0

Вы можете использовать следующий код.

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()) 
} 
0

Вы можете использовать списки для хранения объектов, так что вы можете получить доступ к их

list<myClass> myClasses = new List<myClass>(); 
foreach (myClass object in myClasses) 
{ 
    //preform interaction with your classes here 
} 
0

Не применимо к C#, или любой статически типизированный язык по этому вопросу.

Для любопытства я попытался, если все, что я вспомнил в PHP (создание переменных на лету), по-прежнему верен.

Это все тот же PHP, последний раз я использовал его в 2000 году. Вы можете генерировать переменные «на лету», не говоря о том, что это целесообразно, но оно загрязняет глобальные переменные, оно может повредить некоторые существующие переменные или объекты с такими же имя.

http://ideone.com/Xkpo1

<?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"; 

?> 

Выходы:

The one: I'm tough! 
The one: Says who? 1 
Says who? 2 
Says who? 3 
Смежные вопросы