我有一个自定义的 MVC 框架,我正在对路由 API 进行大修。我试图想出一种干净的方法来隔离我的框架中的“设置”和“执行”,它广泛使用了委托和泛型。现在我从调用方设想这个:
//setup
MyRouter.AddRoute("/foo", () => new MyHandler(), (h) => h.MyMethod);
//h.MyMethod only exists in MyHandler, not in HttpHandler
//execution
MyRouter.Execute(HttpContext);
我目前可以使 AddRoute 方法签名“工作”:
delegate T HandlerInvoker<T>();
delegate string HandlerCallMethod<T>(T handler);
...
public void AddRoute<T>(string pattern, HandlerInvoker<T> invoker, HandlerCallMethod<T> caller) where T is HttpHandler{...}
如果我不需要存储调用者和调用者并且可以做到这一点,那么这会很好。但是,我确实需要存储调用者和调用者以供以后执行。
目前我想做的事情:
- 将它们存储在 a 中
List<object>
,然后使用反射来调用它们。这似乎非常复杂,可能性能不太好 - 走向
AddRoute
执行。这可能会让人们更难使用我的 API,但最终可能会成为我唯一的“好”选择 - 问一个SO问题:)
有没有什么好方法可以存储这些泛型类型而无需大量痛苦的反思?