2013-04-25 1 views
1

나는 기본 클래스 및 일부 파생 클래스가파생 클래스의 "목록"을 정의하는 방법은 무엇입니까?

public class MyBase {...} 
public class MyClass1 : MyBase {...} 
public class MyClass2 : MyBase {...} 

가 지금은 (클래스가 클래스하지 인스턴스를 !!!)이 파생 클래스의 목록을 만들고 싶어해야하고 나는 하나의 인스턴스를 만들려면 이러한 파생 된 클래스의 임의로.

어떻게 작동합니까 ?? 여기

나는 의사 C 번호 :

List<MyBase> classList = new List<MyBase>() { MyClass1, MyClass2, MyClass3, ...} 

MyBase randomInstance = new classList[random.Next(0,classList.Count-1)](); 

(불행하게도이 목록 건설 MyBase의 인스턴스가 아니라 클래스 이름을 예상)에 원하는

당신이 말한대로, 당신은 "생성"싶은 경우

답변

5

:

List<Type> types = new List<Type> { typeof(A), typeof(B), typeof(C) }; 

A instance = (A)Activator.CreateInstance(types[r.Next(0, types.Count)]); 
+0

이 접근법을 사용하는 것을 잊지 마십시오. 목록의 각 유형에는 동일한 의미를 갖는 생성자가 있어야합니다. 디폴트의 ​​인자없는 생성자가 있지만, 각각의 타입이 동일한 서명을 가진 생성자를 가지고 있다면, 여러분은 잘 가게됩니다. –

+0

주의 사항 :이 접근법에 대한 유일한 실질적인 이점은 간결함입니다. 컴파일러는 모든 런타임 유형 정보이므로 발에서 자신을 촬영하지 못하도록합니다. – nitzmahone

+0

불확실 유형 (제네릭 외부)을 처리하려는 경우 어쨌든 유형 안전을 잃게됩니다. –

3

임의의 인스턴스 : 당신이 방법에서 뭔가를 반환 할 수 있도록

var selection = random.Next(0,2) 

switch (selection) 
{ 
    case 1: return new MyBase(); 
    case 2: return new MyClass1(); 
    case 3: return new MyClass2(); 
} 

는,이 클래스의 모든 공통 interface을 정의하는 것이 유용 할 수 있습니다. 또는 간단히 object 또는 dynamic을 반환 할 수 있습니다.

비슷해 (인자없는 생성자 그리고 B와 C를 가정은로부터 유도된다)
+2

모든 클래스가 'MyBase'에서 상속되었거나 상속하므로 반환 유형은 아마도'MyBase '입니다. – zimdanen

5

는이 작성 System.Activator 사용이

class MyBase 
{ 
} 

class MyClass1 : MyBase 
{ 
} 

class MyClass2 : MyBase 
{ 
} 

같은 종류로부터 생성 할 그 물체.

void Main() 
{ 
    var typesToPickFrom = new List<Type>() 
    { 
     typeof(MyBase), 
     typeof(MyClass1), 
     typeof(MyClass2) 
    }; 

    var rnd = new Random(); 
    Type typeToCreate = typesToPickFrom [rnd.Next(typesToPickFrom.Count)]; 
    object newObject = Activator.CreateInstance(typeToCreate); 
} 

필요에 따라 전송할 수 있습니다.

+1

인덱서에서 off-by-1 오버플로 문제가 있다고 말하려고했지만 상위 경계가 배타적이라는 것을 잊었습니다. 내 대답을 고쳤다. :) – nitzmahone

관련 문제