2013-07-15 3 views
0

저는 인터페이스를 등록하는 일반 정적 메서드가 있으며이를 C# 리플렉션을 사용하여 작성해야합니다. 일반 메서드의 리플렉션이 작동하지 않습니다.

Services.AddService<ITBroker>(new TBrokerService()); 

나는 코드를 다음 시도했지만 나에게 매개 변수의 매우 일반적인 예외를 제공합니다 코드 위

Type[] externTBrokerService = Assembly.LoadFrom("Business.dll").GetTypes(); 
Type[] externService = Assembly.LoadFrom("ServiceModel.dll").GetTypes(); 
Type iTBroker = externITBroker[12]; 
MethodInfo method = externService[1].GetMethods()[2]; 
//Gets Add Service method 
MethodInfo generic = method.MakeGenericMethod(iTBroker); 
//Make method generic   
generic.Invoke(null,new object[] { externTBrokerService[0]}); 
//invoke the service 

을 작동하지 않습니다.

위의 코드에 대한 리플렉션을 작성하는 방법은 무엇입니까?

+1

무엇'externService'을 사용할 수 있습니다 인수로 전달 될 필요가 당신의 유형의 인스턴스를 만들려면? 왜 배열의 3 번째 메소드가'AddService '입니까? – Dennis

+0

예외는 무엇입니까? –

+1

그리고'iTBroker'의 가치는 무엇입니까? 여기에 갈 정보가 너무 적습니다. 문제를 시연하는 짧지 만 완전한 프로그램을 제작할 수 있다면 인생을 훨씬 더 분명하게 할 수 있습니다. (그리고 이런 방식이나 형식의 순서에 결코 의존해서는 안됩니다.) –

답변

1

하면 주석 있다는 : externTBrokerService[0]Type 아니라 해당 유형의 인스턴스

하는 것으로.

나는 내 대답의 일부로 다른 주석의 감각을 포함 할 필요성을 느끼고 있습니다.

Type iTBroker = externITBroker[12]; 

잘못되었습니다. 그리고 조만간이 컬렉션의 형식 순서가 결정되지 않아 변경 될 수 있으므로 형식을 찾을 수 없습니다. 다음과 같이해야합니다 :

Type iTBroker = externITBroker.Single(x => x.Name == "ITBroker"); 

이것은 매우 안전한 형태이므로 확실한 결과를 얻을 수 있습니다.

하거나 (이이 유형의 AssemblyQualifiedName 있다고 가정)에 의해 직접적으로 해당 유형을로드 :

Type.GetType("Business.ITBroker, Business"); 

이 방법은 Type.GetMethod의 오버로드 중 하나를 찾을 충분하다이 당신의 유형에 방법을 찾으려면 너의 방법.

Activator.CreateInstance(brokerServiceType); 
관련 문제