我有一本字典,我正在使用它來促進一些基於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);
然而,接口是通用的,因爲它需要知道什麼Request和Response類型:
var myInstance = (MyInterface<TRequest, TResponse>) Activator.CreateInstance(myOperation);
我不知道如何告訴它這些請求和響應類型在這個階段。我假設它可以用反射來完成。我發現我可以通過類似myOperation.GetGenericArguments()的方式獲得這些泛型參數,但我不確定在這個階段如何使用這些參數。有誰知道如何做到這一點?
你能舉個例子嗎?我不確定我以前做過這樣的事情。 – Sinaesthetic
你可以在這裏瞭解所有關於協變接口的知識:[http://msdn.microsoft.com/en-us/library/dd997386.aspx]其實質是你可以用類型的'out'關鍵字來定義你的接口,意味着該接口可以接受派生較少的類而不會出錯。儘管這是一個棘手的領域,但如果你不注意如何設計接口,可能會引入一些有趣的錯誤。 –