我有一个自定义的MVC框架,在其中我正在修改路由API。我正在尝试想出一种干净的方法来隔离我的框架中的"设置"one_answers"执行",该框架广泛使用委托和泛型。现在我从主叫端设想:
//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{...}
如果我不需要存储调用程序和调用者,并且当时可以做得很好,这会很好。但是,我确实需要存储调用程序和调用程序,以便稍后执行。
我目前想做的事情:
- 将它们存储在
List<object>
中,然后使用反射来调用它们。这看起来非常复杂,可能性能不太好 - 正在执行
AddRoute
。这可能会让人们更难使用我的API,但最终可能会成为我唯一的"好"选择 - 询问SO问题:)
有没有什么好的方法可以在不进行大量痛苦反思的情况下存储这些泛型类型?
您可以存储一个为您执行所有转换的匿名委托。
看起来以下内容会起作用(没有以任何方式进行测试):
List<Action> handlers;
handlers.Add(() => caller(invoker()));
请注意,如果您正在缓存invoker
,这将不起作用。
在这种情况下,您需要使值保持不变,Lazy
应该可以做到这一点。
List<Action> handlers;
Lazy<T> lazy = new Lazy<T>(invoker);
handlers.Add(() => caller(lazy.Value);
后者在每次调用该方法时只会创建一个返回值invoker
的实例。由于lazy
是一个局部变量,只要handlers
为您保留了一个引用,它就会自动推送到一个类中。
请注意,我忽略了模式,但您似乎不需要任何帮助。