2009-08-06 2 views
0

리플렉션을 사용하여 성의 인터페이스를 해결할 때 작은 문제가 발생했습니다.Castle Windsor 리플렉션을 통한 인터페이스 해상도

내가 인터페이스 IService를 가지고 있고, 이런 식으로 해결할 수 있습니다 말할 수 있습니다 :

var service = wc.Resolve<IService>(); 

이 예상대로 작동합니다,하지만 난 반사를 통해 메소드를 호출 할이 같은 수행 할 수

MethodInfo method = typeof(WindsorContainer).GetMethod("Resolve",new Type[] {}); 
MethodInfo generic = method.MakeGenericMethod(typeof(IService)); 
var service = generic.Invoke(wc,new object[]{}); 

잘 작동합니다. 이제 리플렉션을 사용하여 다시 작성해야 할 유형을 선택하려고한다고 상상해보십시오.

Type selectedType = assembly.GetType("myProject.IService") 

그리고 다음과 같이 그것을 호출 할 :
MethodInfo method = typeof(WindsorContainer).GetMethod("Resolve",new Type[] {}); 
MethodInfo generic = method.MakeGenericMethod(selectedType); 
var service = generic.Invoke(wc,new object[]{}); 

내가이 성 오류 :

"No component for supporting the service myProject.IService was found" 

selectedType의 유형은 올바른 것으로 보인다,하지만 문제가있다 .

누구든지 resolve 메소드를 올바르게 호출 할 수 있는지 알고 있습니까?

BTW MakeGenericMethod(typeof(selectedType)가 컴파일되지 않습니다.

미리 감사드립니다.

답변

2

왜 MakeGenericMethod가 필요한가요? Castle has a non-generic Resolve method

그냥 container.Resolve(selectedType)이 작동합니까?

+0

container.Resolve (selectedType) 같은 오류가 발생합니다. 비 제너릭 메소드에 대한 포인터를 보내 주셔서 감사합니다. – jheppinstall

1

IService에 대한 구성 요소를 등록하셨습니까? 이것은 나를 위해 잘 작동합니다 :

using System; 
using Castle.Windsor; 
using NUnit.Framework; 

namespace WindsorInitConfig { 
    [TestFixture] 
    public class ReflectionInvocationTests { 
     public interface IService {} 

     public class Service: IService {} 

     [Test] 
     public void CallReflection() { 
      var container = new WindsorContainer(); 
      container.AddComponent<IService, Service>(); 

      var selectedType = Type.GetType("WindsorInitConfig.ReflectionInvocationTests+IService"); 
      var method = typeof(WindsorContainer).GetMethod("Resolve", new Type[] { }); 
      var generic = method.MakeGenericMethod(selectedType); 
      var service = generic.Invoke(container, new object[] { }); 
      Assert.IsInstanceOfType(typeof(IService), service); 
     } 
    } 
} 
+0

답변을 주셔서 감사합니다. 위의 동작을 생성 한 .config 파일에 구성 요소가 등록되어 있습니다. 결국 AddComponent 메서드를 사용하여 구성 요소를 추가했습니다.이 구성 요소는 작동했지만 다소 객체를 무효화했습니다. 이제 String Key를 사용하여 해결할 수 있지만 코드가 아니라 구성에 종속되어 있습니다. – jheppinstall

관련 문제