API 사전 번호를 기반으로 내부 라우팅을 용이하게하기 위해 사용하는 사전이 있습니다. 본질적으로 어떤 일이 일어나는지는 내가 사전을 찾아서 조작하고 그것을 RUN 메서드라고 부르려고 시도한다. 그러나 이것을하기 위해서는 객체를 인터페이스에 캐스트 할 수 있어야합니다.리플렉션을 사용하여 일반 인터페이스로 전송하려면 어떻게해야합니까?
public Dictionary<string, Type> Routing = new Dictionary<string, Type>();
public VersionRouter()
{
Routing.Add("1.0", typeof(OperationV1<RequestObjectV1, ResponseObjectV1>));
Routing.Add("2.0", typeof(OperationV1<RequestObjectV2, ResponseObjectV1>));
Routing.Add("3.0", typeof(OperationV1<RequestObjectV2, ResponseObjectV2>));
}
가 나는과 같이 인스턴스화 할 올바른 유형 잡아 수 있습니다 : 여기가 무슨 뜻이야,이 사전 정상적인 상황에서 다음
var myOperation = Routing["2.0"];
와, 난 그냥 인스턴스화 것 이런 식으로 캐스팅 :
var myInstance = (MyInterface) Activator.CreateInstance(myOperation);
그러나, 인터페이스는 제네릭는 요청 및 응답 유형이 무엇인지 알 필요가 있기 때문에 :
이 요청 및 응답 유형이 현재 어떤 단계인지 알려주는 방법을 모르겠습니다. 나는 그것이 반사와 함께 할 수 있다고 가정하고있다. myOperation.GetGenericArguments()와 같은 것을 통해 일반 매개 변수를 가져올 수 있지만이 단계에서 내 이점을 사용하는 방법을 모르겠습니다. 누구든지이 작업을 수행하는 방법을 알고 있습니까?
예제를 제공 할 수 있습니까? 전에 그런 짓을 한 적이 있는지 잘 모르겠다. – Sinaesthetic
여기에서 공변 (covariant) 인터페이스에 대한 모든 것을 배울 수 있습니다 : [http://msdn.microsoft.com/en-us/library/dd997386.aspx] 본질은 유형에 대해 'out' 키워드로 인터페이스를 정의하는 것입니다. 인터페이스가 오류없이 덜 파생 된 클래스를 받아 들일 수 있음을 의미합니다. 까다로운 부분이지만 인터페이스를 디자인하는 방법에 대해 신중하지 않으면 몇 가지 흥미로운 버그를 소개 할 수 있습니다. –