반사

2012-07-17 4 views
1

를 통해 클래스를 상속하는 모든 싱글을 받기 나는 다음과 같은 시나리오가 :반사

class Cow : Animal 
{ 
    public int animalID; 
    private static Cow instance; 
    public static Cow Instance 
    { 
     get 
     { 
      if (instance == null) instance = new Cow(); 
      return instance;  
     } 
    } 
    private Cow() { } 
} 

CowAnimal에서 상속 보통 싱글입니다. 내가 필요로하는 것 : 으로부터 상속받은 모든 싱글 톤이있는 Dictionary<int, Animal>. a)리스트는 이미 존재하는 모든 싱글 톤으로 이미 채워져있다. (b) 이미 존재하지 않는 내 사전 항목을 추가하는 메소드. 인스턴스화.

public class Cow : Animal { ... } 
public class Goat : Animal { ... } 
public class Zebra : Animal { ... } 

public static class AnimalManagement 
{ 
    static Dictionary<int, Animal> zoo = new Dictionary<int, Animal>(); 
    static void FillDictionary(); 
    static Animal GetAnimalID(int animalID);  
} 

public Main() 
{ 
    var a1 = Cow.Instance; 
    var a2 = Goat.Instance; 

    AnimalManagement.FillDictionary(); 
    // Now, zoo.Count() == 2 

    // Suppose I seeking for Zebra, with animalID == 5: 
    Animal zebra = AnimalManagement.GetAnimalID(5); 
    // Thus, zoo.Count() == 3 and zeebra singleton was 
    // instantiated and added to internal dic of AnimalManagement. 
} 

그래서 난 반사에 의해 실행 시간에 사전을 채우려 : 구현 클래스 암소를 들어

는 염소와 얼룩말은 그 동작을합니다. 내 친구가 될 수 있습니까?

미리 감사드립니다. 기본적으로

+0

왜 클래스 유형별로 싱글 톤을 원하십니까/필요합니까? –

+0

불행히도 우리가 작업하고있는 클래스 모델이 있습니다. 현재로서는 변경할 수 없습니다. –

+0

이 사전을 기본 클래스'Animal'에 추가하고, 파생 클래스에서 가져온 싱글 톤을 생성 할 때이 사전을 동기화 한 다음 노출 할 수 있습니까? –

답변

3

:

var types = myAssembly.GetTypes(t => typeof(Animal).IsAssignableFrom(t) && !t.IsAbstract); 
var instances = types.Select(t => t.GetProperty("Instance", B.Static).GetValue(null, null)); 
+0

아주 좋은 해결책 – OnResolve

+0

거의 내 친구, 내 큰 문제 중 하나는 여기에 싱글 톤 자체가 정확한 이름 인 "인스턴스"를 가질 수 있다는 것입니다. 그것은 내 OO 모델에 따라 어떤 제한도 두지 않았기 때문에 다양 할 수 있습니다. –

+1

그리고 그것은 또 다른 인스턴스입니다. 싱글 톤은 바보입니다. 어떤 곳에서는 "Current"와 "CurrentDomain"과 "Instance"와 다른 쓰레기가 있습니다. 어딘가에 뭔가를 지정해야합니다. 언어는 인터페이스 및 가상 키워드를 통해 다형성을 지원합니다. 이러한 기능을 사용하여 인스턴스에 대한 실제 IoC 컨테이너를 확보하십시오. 훌륭한 C# IoC 컨테이너가 많이 있습니다. – Brannon

1

, 반사는 일반적으로 천천히, 심지어 느린 당신이 검색 조립 일을 할 때 당신이 할 수 있지만. 원하는 구성을 달성하기 위해 메타 데이터 (XML과 같은 일부 DSL)를 사용할 수 있습니까? 당신은 여전히 ​​반사를 원하는 경우

, 그 다음 단계 (의사 코드)로 귀결됩니다

  • 를 취득하여 실행 조립
  • 이 어셈블리
  • 에서 모듈을 얻기의 유형을 가져옵니다 module type.BaseType == typeof (Animal)
  • 일단 이러한 유형이 있으면 생성해야합니다. 싱글 톤 부분을 제거하면 또는 유형의 Instance 메쏘드를 호출 할 수 있습니다. 액티베이터 (activator API)를 사용하여 유형을 만들 수 있습니다. 어느 쪽이든, 당신은 당신의 Animal을 얻습니다.