2012-06-07 4 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(); 
} 

"one", "two"및 "three"라는 이름으로 세 개의 개체가 인스턴스화됩니다.

이것이 가능합니까 아니면 더 나은 해결책이 있습니까?

+0

왜 그렇게해야합니까? 클래스 인스턴스를 배열 또는 Dictionary 에 넣을 수 있습니까? – Joshua

답변

10

이 정적으로 입력 된 언어 수 없습니다 액세스 할 수 있도록

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

또한 각 개체의 속성에 액세스하는 방법을 보여 주셔서 감사합니다 :) – user469453

4

다른 사람들이 당신에게 대체품을 주었지만 아무도 그 이유를 말해주지 못합니다.

동적 이름을 가진 개체에 액세스 할 수 없기 때문입니다.

는 (생각에 대한 음식 : 당신이 그렇게 할 수 있다면 그냥 당신이 그들에 액세스하는 방법 그들은 심지어/코딩이라는 전에 잠시 생각합니다.)

가 대신 Dictionary<string, myClass> 다른 사람이 언급 한 바와 같이 만들 수 있습니다.

4

사용에게 Dictionary<String, myClass> 대신 :

var one = dict["one"]; 

또는 루프 :

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

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

지금 당신은 당신의 이름으로 myClass 인스턴스에 액세스 할 수 있습니다 당신이 필요로하는 것처럼

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

당신은 다음과 같은 코드를 사용할 수 있습니다 명명 된 인스턴스를 참조 할 수 있습니다. 당신이 그 (것)들을 당신이 뭘 하려는지

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

당신은 개체를 저장 목록을 사용할 수 있습니다. 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

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 
관련 문제