c# - 如何最好地构建此 API 以存储通用委托(delegate)以供以后执行

标签 c# design-patterns generics reflection delegates

我有一个自定义 MVC 框架,我正在其中彻底检查路由 API。我正在尝试想出一种在我的框架中分离“设置”和“执行”的干净方法,该方法广泛使用委托(delegate)和泛型。现在我从调用方设想这一点:

//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 问题 :)

有没有什么好的方法可以存储这些泛型类型而无需进行大量痛苦的思考?

最佳答案

您可以存储一个为您执行所有转换的匿名委托(delegate)。

看起来下面的方法可行(未以任何方式测试):

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 为您保存一个引用,该类就会被保存。

请注意,我忽略了模式,但看起来您在那里不需要任何帮助。

关于c# - 如何最好地构建此 API 以存储通用委托(delegate)以供以后执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14824842/

相关文章:

C# - 遍历谓词的模式

swift - 递归解析 CollectionType

c# - OutOfMemoryException 错误

c# - 环境事务中的 TransactionScope 错误不会回滚事务

c# - 如何将 JSON 对象作为参数从 Postman 传递到 ASP.NET WEB API

c# - 将类解释为文本

java - 在两个不具有相似功能的类之间进行选择的适当设计模式

c# - 使用 MS 捆绑的空捆绑

Java:递归泛型编译器错误

java - 在Java中创建泛型类型的实例?