2008-11-11 3 views
3

어셈블리를로드하고 모든 인터페이스를 구현하는 일부 코드가 있습니다 (asm이 유효하고로드 된 어셈블리라고 가정) .어셈블리에서 동적으로로드 된 인터페이스를 사용하여 해당 멤버를 호출하는 방법

var results = from type in asm.GetTypes() 
    where typeof(IServiceJob).IsAssignableFrom(type) 
    select type; 

이제 막혔습니다. 이러한 개체의 인스턴스를 만들고 개체의 메서드와 속성을 호출해야합니다. 그리고 나중에 사용하기 위해 생성 된 객체에 대한 참조를 배열에 저장해야합니다.

+0

호출해야하는 '메서드 및 속성'이 임의적인지 또는 IServiceJob 인터페이스의 멤버인지 여부를 명확히하지 않았습니다. – AnthonyWJones

답변

11

오 와우 - 전 단지 blogged about this 며칠 전입니다. 여기에 지정된 인터페이스를 구현하는 모든 유형의 인스턴스를 반환하는 내 방법입니다 :

private static IEnumerable<T> InstancesOf<T>() where T : class 
{ 
    var type = typeof(T); 
    return from t in type.Assembly.GetExportedTypes() 
      where t.IsClass 
       && type.IsAssignableFrom(t) 
       && t.GetConstructor(new Type[0]) != null 
      select (T)Activator.CreateInstance(t); 
} 

당신이 인터페이스의 어셈블리를 사용하지 않고 조립 매개 변수를 받아이 리팩토링하는 경우, 그것은 당신의 필요에 맞게 유연하게된다.

당신은 Activator.CreateInstance 방법으로 형식의 인스턴스를 만들 수 있습니다
+2

거기에 미치광이 LINQ 남자가 있습니다. ;) –

+0

@Matt 해밀턴 : 기본 빈 생성자가없는 방식으로 생성자를 호출 할 수 있습니까? – topwik

+0

Activator.CreateInstance에는 인스턴스화하는 클래스의 ctor로 전달되는 객체 배열을 허용 할 수있는 오버로드가 있습니다.하지만이 인스턴스를 사용하는 것과 같은 단일 쿼리 내에서 사용할 수있는 방법이 없다고 생각합니다. 여기 게시했습니다. –

1

: -

IServiceJob x = Activator.CreateInstance(type); 

그래서 코드가됩니다 : - IServiceJob []에

IServiceJob[] results = (from type in asm.GetTypes() 
    where typeof(IServiceJob).IsAssignableFrom(type) 
    select (IServiceJob)Activator.CreateInstance(type)).ToArray(); 

(주 변화 VAR이 명확하게하기 창조되고있는 것).

+0

구현 유형에 기본 ctor가없는 경우이 코드는 MethodMissingException을 발생시킵니다. 따라서 내 쿼리에서 확인하십시오. –

+0

@Matt 해밀턴 : 그렇다면 기본 빈 생성자가없는 방식으로 생성자를 호출 할 수 있습니까? – topwik

관련 문제