2012-11-02 2 views
3

다음과 같이 (모든 개체 클래스는 공통 인터페이스가) 내가 뭘 할 수 있습니다 :스토어 클래스 정의 예를 나중에

MyDict.Add("A", MyAObjectClass); // Not an instance 
MyDict.Add("B", MyBObjectClass); 
MyDict.Add("C", MyCOjbectClass); 
String typeIwant = "B"; // Could be passed to a function or something 
MyCommonInterface myobject = MyDict[typeIwant](); 

가 어떻게 이런 식으로 뭔가를 프로그래밍 할 수 있습니까?

이것은 내가 사전에 저장할 모든 단일 유형의 인스턴스를 만들 필요가 없으며 (실제로는 약간있을 수 있음) 대신 실제로 사용할 인스턴스 만 인스턴스로 만들 수 있습니다.

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

dict.Add("A", typeof(TextBox)); 
dict.Add("B", typeof(Button)); 

과 같이 그것에서 객체를 생성 :

답변

5

당신은 유형 객체 유형의 정보를 저장할 수있는이 단지 매개 변수가없는 생성자를 가지는 형태로 작동합니다

object a = Activator.CreateInstance(dict["A"]); 

. 예 : new TextBox(). 형식에 동일한 인수를 사용하는 생성자가있는 경우 dict["A"] 뒤에 인수를 추가하거나 배열을 전달할 수 있습니다.

3

난 강력하게 Unity 또는 Windsor Castle 같은 의존성 주입 라이브러리를 사용하는 것이 좋습니다,하지만 당신은 절대적으로해야하는 경우, 당신은 같은 것을 수행해야이 정말 요구 사항을 만족하는 경우

Dictionary<string, System.Type> MyDict = new Dictionary<string, System.Type>(); 
MyDict.Add("A", typeof(MyAObjectClass)); 
MyDict.Add("B", typeof(MyBObjectClass)); 
MyDict.Add("C", typeof(MyCObjectClass)); 

string typeIwant = "B"; 
var myobject = Activator.CreateInstance(MyDict[typeIwant]); 
+2

의 * 거대한를 추가 왜 * 별도의 프레임 워크의 복잡성 (이 솔루션과 비교)? – SimonC

+1

@ SimonC : 'Unity'와 같은 프레임 워크를 추가하면 "거대한"복잡성이 추가된다고 생각합니까? 코드는 실제로 인스턴스화 가능한 클래스의 목록이 커짐에 따라 감소 할 것입니다. – code4life

+2

당신은 여전히 ​​'name'매핑을 사용하여 프레임 워크를 구성하여 사전과 정확히 똑같은 방식으로 확장하려고 시도하지만 프레임 워크 구성 방법, API는 무엇인지 알아야합니다. , 어떤 버그가 존재하는지 등등, 당신의 코드를 관리하는 다른 모든 사람들도 마찬가지입니다. – SimonC

관련 문제