Создание объектов динамически в цикле

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

например:

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

class myClass(){

    public myClass(){
    }
}

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

приведет к созданию экземпляров трех объектов с именами "один", "два"и " три".

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

9 ответов


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

использовать 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 ];
}

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

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

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

создать Dictionary<string, myClass> Как уже упоминалось.


Вы можете использовать этот подход:

  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';
});

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

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

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

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

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


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

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

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

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

classes[name].MyClassMethod();

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

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

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

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

неприменимо к 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