我有一本字典,我正在使用它来促进一些基于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'关键字来定义你的接口,意味着该接口可以接受派生较少的类而不会出错。尽管这是一个棘手的领域,但如果你不注意如何设计接口,可能会引入一些有趣的错误。 –