2012-06-07 27 views
9

Tengo una matriz de cadenas que estoy recorriendo. Me gustaría recorrer la matriz y en cada iteración, crear un nuevo objeto con un nombre que coincida con el valor de la cadena.Creación de objetos dinámicamente en el bucle

Por ejemplo;

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

class myClass(){ 

    public myClass(){ 
    } 
} 

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

daría lugar a tres objetos que se crea una instancia, con los nombres de "uno", "dos" y "tres".

¿Es esto posible o hay una solución mejor?

+0

¿Por qué necesita para hacer eso? ¿No puedes poner las instancias de clase en una matriz, o tal vez en un Dictionary ? – Joshua

Respuesta

10

¿Qué está tratando de hacer no es posible en el lenguaje de tipo estático. IIRC, eso es posible en PHP, y no es aconsejable.

utilizar el diccionario en su lugar: 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); 
    } 
} 

Salida:

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

Gracias por también demostrar cómo acceder a las propiedades de cada objeto también :) – user469453

4

Mientras que otros le han dado una alternativa, pero nadie está diciendo por qué lo recomiendan.

Eso es porque No puede acceder al objeto con nombres dinámicos.

(Alimento para el pensamiento: Sólo piensen por un momento si pudiera hacerlo, ¿cómo va a acceder a ellos antes de que sean codificados/nombrados.)

su lugar crear un Dictionary<string, myClass> como han mencionado otros.

4

Utilice un Dictionary<String, myClass> lugar:

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

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

Ahora puede acceder a los myClass casos por sus nombres:

var one = dict["one"]; 

o en un bucle:

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

Parece que necesitas una lista del diccionario de sus objetos:

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

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

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

No hay lenguajes de programación que conozca que le permitan definir nombres de variables en tiempo de ejecución.

0

se podría hacer algo como esto -

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

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

A continuación, se puede hacer referencia a las instancias con nombre después

classes[name].MyClassMethod(); 
0

Usted puede utilizar el código siguiente.

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

Puede usar listas para almacenar los objetos para que pueda acceder a ellos

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

No es aplicable a C#, o cualquier lenguaje de tipo estático para el caso.

Por curiosidad, probé si lo que recordaba en PHP (crear variables sobre la marcha) sigue siendo correcto.

Sigue siendo el mismo PHP, el último que utilicé fue el año 2000. Puede generar variables sobre la marcha, sin decir que es aconsejable, contamina las variables globales, puede corromper algunas variables u objetos existentes con el mismo nombre.

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

?> 

Salidas:

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