2012-06-07 13 views
9

Possiedo un array di stringhe su cui sto eseguendo il ciclo. Vorrei scorrere l'array e su ogni iterazione, creare un nuovo oggetto con un nome che corrisponda al valore della stringa.Creazione di oggetti dinamicamente nel ciclo

Ad esempio;

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

class myClass(){ 

    public myClass(){ 
    } 
} 

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

Farebbe sì che tre oggetti vengano istanziati, con i nomi "uno", "due" e "tre".

È possibile o esiste una soluzione migliore?

+0

Perché avete bisogno di farlo? Non puoi mettere le istanze di classe in un array, o forse un dizionario ? – Joshua

risposta

10

Cosa stai cercando di fare non è possibile in un linguaggio staticamente tipizzato. IIRC, è possibile su PHP, e comunque non è consigliabile.

utilizzare il dizionario, invece: 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); 
    } 
} 

uscita:

hahah one! 
hahah two! 
hahah three! 
Test 
hahah two! 
+0

Grazie per aver anche dimostrato come accedere alle proprietà di ogni oggetto :) – user469453

4

Mentre altri ti hanno dato un supplente, ma nessuno ti dice perché ti consigliano questo.

Ecco perché Non è possibile accedere all'oggetto con nomi dinamici.

(Cibo per la mente: Basta pensare per un momento se si potesse fare così, come potrete accedervi, prima che esse codificati/nome.)

invece creare un Dictionary<string, myClass> come gli altri citati.

4

Utilizzare un Dictionary<String, myClass> invece:

var dict= new Dictionary<String, myClass>(); 

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

Ora è possibile accedere alle myClass casi dai vostri nomi:

var one = dict["one"]; 

o in un ciclo:

foreach (string name in array) 
{ 
    myClass m = dict[ name ]; 
} 
0

Sembra che avete bisogno un elenco di dizionario dei tuoi oggetti:

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

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

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

ci sono linguaggi di programmazione, che io sappia che consentono di definire i nomi delle variabili in fase di esecuzione.

0

Si potrebbe fare qualcosa di simile -

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

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

Quindi è possibile fare riferimento alle istanze denominate in seguito

classes[name].MyClassMethod(); 
0

È possibile utilizzare il seguente codice.

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

È possibile utilizzare gli elenchi per memorizzare gli oggetti in modo da potervi accedere

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

Non applicabile a C#, o qualsiasi altro linguaggio staticamente tipizzato per quella materia.

Per curiosità, ho provato se ciò che ricordavo in PHP (creazione di variabili al volo) è ancora corretto.

È lo stesso PHP, l'ultimo l'ho usato era l'anno 2000. È possibile generare variabili al volo, non dicendo che è consigliabile, ma inquina le variabili globali, può corrompere qualche variabile o oggetto esistente con lo stesso nome.

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

?> 

Uscite:

The one: I'm tough! 
The one: Says who? 1 
Says who? 2 
Says who? 3 
Problemi correlati