2014-08-28 3 views
0

이 문제에 대한 해결책을 찾으려고 인터넷을 검색했습니다. 싱글 톤과 같은 패턴에 대해 많이 읽으십시오. 그러나 제 생각에는 문제를 해결할 수있는 좋은 해결책을 찾을 수 없습니다. (꽤 간단한 문제라고 생각합니다.)프로젝트의 모든 클래스를 목록에 추가하는 방법

많은 파생 클래스가있는 솔루션이 있습니다. 내가 원하는 것은 목록/컨테이너/참조 할 수있는/액세스 할 수있는/내 솔루션에서 각 클래스의 개체를 포함하는 것입니다.

그래서 이런 식으로 뭔가 :

public class Main 
{ 
    public static List<Operation> classList; 
    public Main() 
    { 
     initialize(); 
    } 

    public void initialize() 
    { 
     classList = new List<Operation>(); 
     Operation operation1 = new operation1(); 
     Operation operation2 = new operation2(); 
     classList.Add(operation1); 
     classList.Add(operation2); 
    } 
} 

조작 클래스는 홈페이지에서 파생됩니다.

Operation1 및 Operation2 클래스는 Operation 클래스에서 파생됩니다.

UPDATE :이 작업에서 파생 조립의 모든 유형을 찾을 수

classList[].callMethodFromClass or classList("operation1").callMethodFromClass 
+3

내가 물어봐도 될까요? 왜 그런 용기가 필요한가요? 그 목적은 무엇입니까? –

+1

리플렉션을 사용하여 출력 디렉토리의 모든 DLL에있는 모든 클래스의 유형을 찾을 수 있습니다. 리플렉션을 사용하여 각 유형의 객체를 인스턴스화 할 수도 있습니다. 이게 너가하고 싶은거야? – demoncodemonkey

+0

어디서 오류가 발생합니까? – faby

답변

1

:

내가 나중에하고 싶은 것은이 같은 것입니다. 하지만 솔루션에는 둘 이상의 어셈블리가 포함될 수 있습니다.

Type baseType = typeof(Operation); 
foreach (var type in typeof(Main).Assembly.GetTypes() 
    .Where(type => baseType.IsAssignableFrom(type))) { 
     classList.Add(type); 
} 

편집 : 유형 자체 대신 이러한 유형의 인스턴스를 추가하는 것을 잊었습니다. 그래서

classList.Add((Operation)Activator.CreateInstance(type)); 

대신 사용해야합니다.

+0

foreach 문에서 오류 얻기 : mscorlib.dll에서 처리되지 않은 'System.StackOverflowException'예외가 발생했습니다 –

+0

문제가 발견되었습니다! 생성자에서 initialize()를 시작하고 생성자를 다시 호출하는 메서드를 읽을 때마다 시작합니다. 그래서 재귀 적으로 스스로를 호출합니다. initialize 메소드는 어디에서 실행해야합니까? –

2

당신은 이것에 대한 반성이 필요합니다 :

IEnumerable<Type> derivedTypes = Assembly 
    .GetAssembly(typeof(Operation)) 
    .GetTypes() 
    .Where(type => typeof(Operation).IsAssignableFrom(type)); 

그런 다음, 각 유형에 대해, 당신은 Activator를 사용하여 인스턴스를 만들 수 있습니다

Operation operation = (Operation)Activator.CreateInstance(type); 

위의 코드는 모든 파생 유형에 상주하는 것으로 가정 Operation 클래스와 같은 어셈블리. 여러 어셈블리에 분산되어 있다면 각 어셈블리에 대해 위의 프로세스를 반복해야합니다. 또한 작업 유형 자체가 유형 모음에 포함됩니다. 문제가있는 경우 구체적으로 확인해야합니다.

위의 Activator 코드는 인수를 취하지 않는 생성자가있는 클래스에만 적용됩니다. 그 패턴에 맞지 않는 클래스가 있다면, 상황은 더욱 복잡해집니다. 생성자 인수로 사용할 개체 배열을 사용하는 CreateInstance에 과부하가 있지만 문제는 이러한 인수가 있어야 할 대상을 결정하는 데 있습니다. 그것은 당신이 상대하고있는 특정 클래스에 대한 지식이 필요합니다. 다시 말해, 어떤 클래스가 실수로 코드를 손상시키지 않도록하기위한 검사를 추가하고, 모든 클래스가 특정 표준을 준수하는 생성자를 갖도록 요구하기를 원할 것입니다 (예 : no 매개 변수).

+0

현재 그들은 모두 같은 어셈블리에 있습니다. 이 인스턴스가 런타임에 생성된다고 말할 때 나는 맞습니까? 나는 컴파일 타임에 인스턴스로부터 메소드를 호출하기를 원한다. 그러나 모든 생성자에는 매개 변수가 없습니다. –

+0

인스턴스는 런타임에 생성됩니다 (예). 컴파일 타임에 이와 같은 작업을하고 싶다면 ... 곧 Roslyn을 사용하거나 PostSharp 나 Fody 같은 일리노이 직조 도구를 사용하십시오. 또는 아마도 T4와 함께,하지만 그건 해키 솔루션처럼 들리 네요. ;)하지만 컴파일 타임에 메소드를 왜 호출하려고합니까? 코드를 생성 하시겠습니까? –

+0

IEnumerable 줄에 오류 받기 : 처리되지 않은 'System.StackOverflowException'형식의 예외가 mscorlib.dll에서 발생했습니다. 다시 생각하면 실제로 컴파일 할 때 메서드를 호출해야하는지 잘 모르겠습니다. 어쨌든 오류를 해결하면 문제 해결을위한 해결책이 될 수 있습니다. –

관련 문제