我可以添加编译时检查以确保这是合法的处理程序函数吗? (受限通用)

2024-06-28

查看评论...我希望第二个 MapPost 调用在编译时失败。 我只是在尝试使用 asp.net 最小管道。 我认为这需要受限泛型,但我是 C# 新手,所以认为有人可以快速回答这个问题(希望如此!)。

var router = new ExampleRouter();
var controller = new ExampleWebController();

router.MapPost("/api/ProcessJob", controller.ProcessJob);

// I would like this to be a compile time error, instead of a runtime startup error.
router.MapPost("/api/ProcessJob2", controller.InvalidHandler);

class ExampleWebController {
    public ExampleWebController() { }
    public void InvalidHandler() {  }
    public bool ProcessJob(Job job) { return true; }
}

class ExampleRouter {
    public ExampleRouter() { }

    // TODO: Check at compile that `handler` takes a DTO and returns bool
    public void MapPost<TFunc>(string path, TFunc handler) {
        var func_type = typeof(TFunc);
        // Prints "System.Func" for ProcessJob
        // Prints "System.Action" for InvalidHandler
        Console.WriteLine(func_type);
        var args = func_type.GetGenericArguments();
        foreach (Type arg in args) {
            // Prints "Job", "System.Boolean" for ProcessJob...awesome
            Console.WriteLine(arg);
        }

        // Construct the DTO dynamically.
        // In reality, we'd do this when a http request comes in.
        var job_type = args[0];
        var job_obj = Activator.CreateInstance(job_type);
        DTO dto = (DTO)job_obj;
        // Prints "Hello I constructing from test body"
        dto.construct_from_body("test body");
    }
}

interface DTO {
    public void construct_from_body(string body);
}

class Job : DTO
{
    public Job() {  }

    public void construct_from_body(string body)
    {
        Console.WriteLine($"Hello I constructing from {body}");
    }
}

什么是无效的? 你想让编译器每次都失败吗void处理程序?
实现此目的的一种方法最多有两个参数:

public class MapPostImplementations
{
    struct Discard
    {
    }

    public void MapPost<A, B, R>(string path, Func<A, B, R> handler)
    {
        // Ignore the Discard type arguments
    }

    public void MapPost<A, R>(string path, Func<A, R> handler)
    => MapPost<A, Discard, R>(path, (a, _) => handler(a));

    public void MapPost<R>(string path, Func<R> handler)
    => MapPost<Discard, R>(path, _ => handler());

    class ExampleWebController
    {
        public void InvalidHandler() { }
        public bool ProcessNumber(int v) { return true; }
        public bool ProcessString(string v) { return true; }
    }

    ExampleWebController controller = new ExampleWebController();

    void Test()
    {
        MapPost<string, bool>("/api/foo", controller.ProcessString);

        MapPost<int, bool>("/api/numberFoo", controller.ProcessNumber);

        // does not compile
        //MapPost("/api/bar", controller.InvalidHandler);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以添加编译时检查以确保这是合法的处理程序函数吗? (受限通用) 的相关文章

  • 什么可能导致 sock send() 命令上的“资源暂时不可用”

    什么会导致Resource temporarily unavailable套接字上的错误send 命令 套接字设置为AF UNIX SOCK STREAM 它在大多数情况下都有效 但偶尔会出现此错误 套接字的接收端似乎工作正常 我知道这不是
  • pop() 期间提升 Fibonacci 堆访问冲突

    Context 我目前正在实现某种形式的 A 算法 我决定使用 boost 的斐波那契堆作为底层优先级队列 我的图表是在算法运行时构建的 作为我使用的顶点对象 class Vertex public Vertex double double
  • 信用卡号应该存储为字符串还是整数?

    是啊 只是想想而已 我应该将在我的网站上输入的信用卡号存储为字符串还是整数 我的意思是 它们由数字组成 这让我认为它是一个整数 但我不对它们进行数学运算 所以也许字符串更合适 编辑 所以我必须在加密之前存储在某个时刻输入的数字 我可能应该更
  • 在 Windows 应用商店应用程序 (Win 8.1) 中使用 MIDI

    我的目标是在 Windows 应用商店应用程序中接收 MIDI 消息 微软提供了一个名为Microsoft WindowsPreview MidiRT 作为 nuget 包 我设法获得了 MIDI 端口 但是MessageReceived尽
  • 我想要 Linux 上的 C 函数来收集核心转储而不终止进程

    abort 确实收集核心转储 但我不希望进程终止 dump core 收集核心转储 但在内核空间中 用户空间中是否有与 dump core 等效的函数 自己做的一个简单方法是fork进程 创建父进程的完整副本 并调用abort来自子进程 子
  • 可以作为参数传递给 POST 方法的对象的最大大小

    我有一个带有 POST 方法的 Web API 控制器 如下所示 public class MyController ApiController POST api Scoring public HttpResponseMessage Pos
  • 共享库 C++ Makefile

    我需要编译胖二进制文件才能在另一台 Linux 机器上使用它 但缺少一些库 因此据我了解 我应该使用一些 shared 选项来编译它 但我不明白如何为此配置 Makefile 目前我的 makefile 如下所示 CC g CC FLAGS
  • 在 C 中使用模板函数的最短示例?

    我如何处理函数echo tpl可以采取1类型参数int or string 然后打印出来 C没有模板 我认为你能做的最好的事情就是使用联合或让函数具有不同的名称 后一种具有不同名称的方法是准标准方法 例如fabs fabsf fabsl a
  • 错误:调用 Configuration.BuildSessionFactory() 时“无法同时获取多个包”;

    升级到 NHibernate 2 1 后 我们收到此错误 QueryException Cannot simultaneously fetch multiple bags NHibernate Loader BasicLoader Post
  • 使用 C# 将文件列表从 ftp 下载到本地文件夹? [复制]

    这个问题在这里已经有答案了 我希望将 ftp 中的所有文件下载到本地文件夹 下载到本地驱动器后 所有文件都应在 ftp 中删除 从下面的代码 我只能从 ftp 下载一个我不期望的文件 我需要将所有文件放在一个文件夹中 但不放在本地文件名的名
  • C++ 局部变量销毁顺序

    C 11 中是否存在局部变量释放的定义顺序 更简洁地说 同一作用域中两个局部变量的析构函数的副作用将以什么顺序变得可见 e g struct X X do something int main X x1 X x2 return 0 Is x
  • main() 是用户定义函数吗? [复制]

    这个问题在这里已经有答案了 程序员does定义内部发生的事情main 毕竟 那么 它应该被视为用户定义的函数吗 C 标准没有用户定义函数的概念 相反 它有一个概念库函数 main 不是库函数 但是 该标准还对其签名提出了一些要求 并且不得重
  • CMake include_directories 和 add_subdirectories 之间的区别?

    我正在学习 CMake 来构建 C 代码 并努力解决以下概念 在我的根级目录中 我有一些 cpp 文件和 CMakeLists txt 它们在 gen cpp 目录中成功生成了一些 thrift 代码 我的根级别 CMakeLists tx
  • “#include ”导致“错误:asm/io.h:没有这样的文件或目录”

    我正在使用 gentoo 并尝试编译一个程序来控制并行端口上的位 它的顶部附近有这一行 include
  • 在 Silverlight 中调用 WCF 服务时使用 Observable.FromEvent

    我正在尝试使用 NET Reactive Framework 来简化对我正在编写的 Silverlight 3 应用程序使用的 WCF 服务的一些异步调用 问题是我很难找到一种有效的方式来构建我的代码 毫无疑问 部分问题是了解 Reacti
  • 对双向链表进行排序 C++

    尝试通过遍历列表的循环来完成此操作 在循环中 我将头节点输入到我定义的排序函数中 然后使用 strcmp 来确定节点中的哪个名称是否应该排在前面 它不起作用 因为写得太早了 我通过一次沿着列表一个节点进行线性比较 而不是回去查看第一个节点是
  • 查询 XmlDocument 而不会出现“命名空间前缀未定义”问题

    我有一个 Xml 文档 它定义并引用了一些命名空间 我将其加载到 XmlDocument 对象中 据我所知 我创建了一个 XmlNamespaceManager 对象 用于查询 Xpath 问题是我收到命名空间 my 未定义的 XPath
  • 使用 C# winforms 与 Windows 中的其他桌面应用程序交互

    我想知道是否可以与使用我的程序的其他程序进行交互 例如 单击另一个程序上的按钮等 我不确定这是否可能 但如果可能的话 有人可以提供一些 C 示例代码 Thanks 您可以创建消息并将其发送到其他进程 为此 您必须在 C 代码中使用 P In
  • 如何使用 Dictionary 属性序列化对象?

    在下面的示例代码中 我得到了这个error 元素 TestSerializeDictionary123 Customer CustomProperties 呕吐型 System Collections Generic Dictionary
  • 如何在控制台应用程序中创建事件循环/消息管道?

    我想创建一个注册了一些事件的控制台应用程序 问题是这些事件永远不会被触发 在这种特殊情况下Windows 窗体 http en wikipedia org wiki Windows Forms我应该调用的应用程序Application Ru

随机推荐

  • 部署到 Heroku 时找不到“site”模块

    我正在尝试将 django 应用程序部署到 Heroku 但我不断收到错误 ImportError no module named site 我正在使用来自的自定义构建包https github com jiaaro heroku buil
  • 如何针对 Mac OS X 10.5 进行编译

    我想编译 10 5 及更高版本的应用程序 自从我升级到 Snow Leopard 并安装了最新的 XCode 后 gcc 默认为 10 6 我试过了 isysroot Developer SDKs MacOSX10 5 sdk但这似乎不起作
  • 使用 htaccess 禁用目录浏览

    在我的服务器中我有一系列文件夹 我会拒绝对所有这些文件夹的访问 我能怎么做 我必须使用什么规则 在 htaccess 根目录中添加一行 deny from all 问题 如果您想保留自己的访问权限 allow from 192 168 1
  • PrimeFaces 3.0.M3 单元编辑器不更新值

    我读过了there https stackoverflow com questions 6365877 cell edit in primefaces is not updating the value 6487361 6487361 但我
  • div 宽度,单位:厘米(英寸)

    我需要在每个显示器中放入宽度为 25 厘米 10 英寸 的站点 div 我怎样才能做到呢 您可以简单地使用cmCSS 中的单位 mydiv width 25cm 请注意 正如其他人指出的那样 结果仍然取决于操作系统对显示器尺寸的正确读取 S
  • 剥掉所有的身体标签而不毁掉他们的孩子

    此 Ruby 代码使用Nokogiri http nokogiri org doc xpath tbody remove 删除 的子项 tbody 以及 tbody 他们自己 我只想删除所有 tbody 文档中的标签 将其子项留在原处 我怎
  • HTML输入日期,如何减少日期和图标之间的间距?

    我需要压缩输入类型日期 所以我尝试将宽度设置为 120px 问题是有一个space日期数字和输入日期图标之间 我需要减少或删除该空间 有没有办法做到这一点 我的代码 顺便说一句 我正在使用 bootstrap 4
  • 你可以在 Android 中有意打开多个文件吗?

    我正在尝试在 Android Studio 中编写一个应用程序来打开多个音乐文件并存储它们的路径 目前我所做的只是一次加载一个文件 这不会出现任何问题 例如 下面的代码显示了我的加载按钮的 onclicklister 和相关代码 本示例的一
  • Java字符串对象的创建

    我一直在阅读 Java String 对象 并且有这个问题 String x a String y b 它在Java中创建两个对象吗 这两行代码不会创建任何对象 字符串文字 例如 a 被放入字符串池 https stackoverflow
  • enableHiveSupport 在 java Spark 代码中引发错误[重复]

    这个问题在这里已经有答案了 我有一个非常简单的应用程序 尝试使用 Spark 从 src main resources 读取 orc 文件 我不断收到此错误 无法实例化具有 Hive 支持的 SparkSession 因为找不到 Hive
  • 通过绑定启用 TabItem

    我想在不同页面是 TabItem 的应用程序中使用 MVVM 为此 我使用视图模型 项目 的可观察集合并将其绑定到选项卡控件 ItemSource 对于每个视图模型 我创建了一个单独的数据模板来呈现正确的视图 如下所示
  • 如何用惰性传播实现线段树?

    我在互联网上搜索了有关线段树的实现的信息 但在惰性传播方面却一无所获 之前有一些关于堆栈溢出的问题 但它们专注于解决 SPOJ 的一些特定问题 虽然我认为这是用伪代码对线段树的最好解释 但我需要用惰性传播来实现它 我发现以下链接 除了上面的
  • 用于 GNU C++ 的 SSE SSE2 和 SSE3 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一个简单的教程可以帮助我快速掌握 GNU C 中的 SSE SSE2 和 SSE3 如何在SSE中
  • 使用 Mathematica 在定义位置的左侧或右侧“StringCut”

    论读书这个问题 https stackoverflow com q 6052211 499167 我认为使用下面的问题会很简单StringSplit 给定以下字符串 我想将其 剪切 到每个 D 的左侧 以便 I get a List片段数
  • Google AppEngine Python 3.7 上的自定义库

    我正在尝试在 Google AppEngine Python 3 7 标准环境上部署一项服务 该环境需要一组库作为依赖项 无法部署依赖项之一 GDAL 2 2 2 并返回错误消息 File upload done Updating serv
  • 调用异步方法和 Task.Run 异步方法之间的区别

    我的视图模型中有一个方法 private async void SyncData SyncMessage syncMessage if syncMessage State SyncState SyncContacts this SyncCo
  • Django:如何从模型中验证 unique_together

    我有以下内容 class AccountAdmin models Model account models ForeignKey Account is master models BooleanField name models CharF
  • 如何从不同的进程关闭窗口

    我有一个 C 应用程序 我想指示它从不同的进程中很好地关闭 我还希望能够要求它打开主窗口 我有一个对其主窗口句柄的引用 我知道我可以使用远程处理或 WCF 等复杂的方案来做到这一点 问题是我可以使用更简单的机制 例如窗口消息 或 c 应用程
  • .htaccess RewriteRule 中的单个点有什么作用?

    使用 Wordpress 作为 CMS htaccess 文件如下所示 RewriteEngine On 1 ok enables engine RewriteBase blog 2 sets blog directory as base
  • 我可以添加编译时检查以确保这是合法的处理程序函数吗? (受限通用)

    查看评论 我希望第二个 MapPost 调用在编译时失败 我只是在尝试使用 asp net 最小管道 我认为这需要受限泛型 但我是 C 新手 所以认为有人可以快速回答这个问题 希望如此 var router new ExampleRoute