2012-02-15 4 views
2

내 응용 프로그램 도메인에 모든 어셈블리를로드 한 다음 특정 기본 유형 및 모든 생성자의 인터페이스를 생성자 인수로 찾는 모든 어셈블리를로드하려고합니다. 아래의 코드가 있지만 인터페이스 매개 변수를 찾는 방법을 설명 할 수는 없습니다.리플렉션을 사용하여 인터페이스 매개 변수가있는 생성자를 찾으십시오.

var assembliesWithPluginBaseInThem = AppDomain.CurrentDomain.GetAssemblies() 
    .Where(x=>x.GetTypes().Where(y=>y.BaseType== typeof(PluginBase) && 
    y.GetConstructor(new Type[]{typeof(interface)}) 
+1

당신은 또 다른 IoC 컨테이너를 만들려고하지 않으십니까? ;) –

+0

그냥 어셈블리를 제한하려고하지 않습니다. IOC에 전달합니다. – Jon

+0

어느 IoC 컨테이너를 사용하고 있습니까? –

답변

2

이런 일에 대해 어떻게 : 확인

var assembliesWithPluginBaseInThem = AppDomain.CurrentDomain.GetAssemblies() 
    .Where(x => 
     x.GetTypes().Any(y => 
      typeof(PluginBase).IsAssignableFrom(y) && 
      y.GetConstructors().Any(z => 
       z.GetParameters().Count() == 1 && // or maybe you don't want exactly 1 param? 
       z.GetParameters().All(a => a.ParameterType.IsInterface) 
      ) 
     ) 
    ); 
+0

꽤 컴파일되지 않습니다 – Jon

+0

이것은 일반적인 아이디어였습니다. 적어도 공란을 채울 수 있다고 생각했지만, 여기 있습니다. –

+0

이것은 인터페이스 생성자 인수가 없더라도 OR을 어떻게해서든지 PluginBase를 반환하는 것처럼 보입니다 – Jon

3
var types = 
    from a in AppDomain.CurrentDomain.GetAssemblies() 
    from t in a.GetTypes() 
    where t.GetConstructors() 
       .Any(c => c.GetParameters() 
           .Any(p => p.ParameterType.IsInterface)) 
    select t; 
1

내가 제안 특정 유형의 하위 클래스에서 클래스는

yourClass.IsSubclassOf(typeof(parentClass)) 

그래서 그것을 사용하기 아래처럼 보일 것입니다 :

var assembliesWithPluginBaseInThem = AppDomain.CurrentDomain.GetAssemblies() 
    .Where(x=>x.GetTypes().Where(y=>y.IsSubclassOf(typeof(PluginBase)) && 
    y.GetConstructor.Any(c => c.GetParameters() 
           .Any(p => p.ParameterType.IsInterface) 
+0

PluginBase가 추상적 인 경우 차이가 있습니다. – Jon

+0

차이가 없습니다. –

관련 문제