Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何最好地构造此API以存储通用委托以供以后执行_C#_Design Patterns_Generics_Reflection_Delegates - Fatal编程技术网

C# 如何最好地构造此API以存储通用委托以供以后执行

C# 如何最好地构造此API以存储通用委托以供以后执行,c#,design-patterns,generics,reflection,delegates,C#,Design Patterns,Generics,Reflection,Delegates,我有一个定制的MVC框架,我正在其中大修路由API。我正试图想出一种干净的方法,在我广泛使用委托和泛型的框架中分离“设置”和“执行”。现在,我从呼叫端设想: //setup MyRouter.AddRoute("/foo", () => new MyHandler(), (h) => h.MyMethod); //h.MyMethod only exists in MyHandler, not in HttpHandler //execution MyRouter.Execute(H

我有一个定制的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{...}
委托T HandlerInvoker();
委托字符串HandlerCallMethod(T处理程序);
...
public void AddRoute(字符串模式、HandlerInvoker调用程序、HandlerCallMethod调用程序),其中T是HttpHandler{…}
如果我不需要存储调用者和调用者,并且可以很好地完成,那么这将很好地工作。但是,我确实需要存储调用程序和调用程序,以便以后执行

当前我想做的事情:

  • 将它们存储在
    列表中,然后使用反射调用它们。这看起来非常复杂,性能可能不太好
  • AddRoute
    移动到执行。这可能会使使用我的API的人更加困难,但可能最终成为我唯一的“好”选择
  • 问这样一个问题:)

有没有什么好方法可以存储这些泛型类型而不必进行大量痛苦的反思

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

看起来以下各项可以正常工作(未以任何方式进行测试):

后者在每次调用该方法时只创建一个
调用程序
返回值的实例。由于
lazy
是一个局部变量,因此只要
handlers
为您保留一个引用,它就会被自动推到一个类中


请注意,我忽略了模式,但您似乎不需要任何帮助。

我最终做了一些类似于您的第一种方法的事情。正在创建一个委托,该委托没有
var h=invoker()。。。h、 Foo=“bar”等。。呼叫方(h)
List<Action> handlers;
handlers.Add(() => caller(invoker()));
List<Action> handlers;
Lazy<T> lazy = new Lazy<T>(invoker);
handlers.Add(() => caller(lazy.Value);