2016-09-11 3 views
0

나는이 부모 클래스 "구성 요소", 그리고 "컴포넌트 1", "컴포넌트 2"에서 상속 일부 클래스 등등 내가 목록 List<Component> Components특정 유형의 새 인스턴스를 만들 동적으로

을하고 난 작성해야 그것에서 상속 목록에 추가 일부 클래스의 새로운 인스턴스 Components

내가 지금 뭐하는 거지 방법은 내 코드가 커질수록, 나는 더 많은 구성 요소를 추가 할 필요가

private void AddComponent(string componentType) 
{ 
    if (componentType == "component1") 
    { 
     Components.Add(new component1()); 
    } 
    if (componentType == "component2") 
    { 
     Components.Add(new component2()); 
    } 
    // and so on 
} 

같은 것입니다 . 그래서 나는 사물에 대해 갈 수있는 더 좋은 방법이 있는지 궁금합니다.

나는 주위를 둘러 보았다 나를 위해 작동하지 않았다 이러한 방법으로 발견

var newComponent = Activator.CreateInstance(Type.GetType(componentType)); 
    newComponent = Convert.ChangeType(newComponent, Type.GetType(componentType)); 

    Components.Add(newComponent); 

는 말한다 : cannot convert from 'object' to Component

편집 : 해결, 나는 캐스팅을 깜빡입니다. 파생 클래스가 빈 생성자가 있고 구성 요소 유형을 사용하는 대신 직접 캐릭터 라인 표현을 통과 괜찮 경우

+3

Activator.CreateInstance는 object를 반환합니다. Components.Add()는 Component를 허용합니다. 어떤 시점에서 캐스트해야합니다. 예. Components.Add ((Component) newComponent); – moreON

+0

@moreON 어리석은 나를 추측한다. 감사. –

답변

4

, 당신이 이런 식으로 뭔가를 할 수 :

private void AddComponent<T>() where T : Component, new() 
{ 
    Components.Add(new T()); 
} 

/* ... */ 

AddComponent<Component1>(); 
AddComponent<Component2>(); 

Component 가정하는 것은에서의 기본 클래스입니다 다른 모든 구성 요소가 파생됩니다.

1

당신은이 작업을 수행 할 수 있어야한다 :

var newComponent = Activator.CreateInstance(Type.GetType(componentType)); 
Components.Add((Component)newComponent); 

Activator.CreateInstance 단순히 객체를 생성합니다 - 아무것도로 변환 할 필요가 없습니다. 간단한 캐스트만으로 목록에 추가 할 수 있습니다.

관련 문제