如何让最小 API 绑定查询字符串中的数组

前言

在上次的文章中,我们实现了《让 ASP.NET Core 支持绑定查询字符串中的数组》:

[HttpGet]
public string Get([FromQuery][ModelBinder(BinderType = typeof(IntArrayModelBinder))] int[] values)
{return string.Join(" ", values.Select(p => p.ToString()));
}

但是,同样的实现方式,在最小 API 上却报错:

09425a91c10b7330422b226630828196.png

那么,使用最小 API 能实现相同功能呢吗?

深入探究

实现扩展方法

通过错误提示,我们发现最小 API 在查找类型的静态 TryParse 方法:

No public static bool int[].TryParse(string, out int[]) method found for values.”

于是,我们尝试为int[]类型创建TryParse扩展方法:

public static class IntArrayExtentions
{ public static bool TryParse(this int[] obj, string value, out int[] result){result = value.Trim('[', ']').Split(',').Select(str => int.Parse(str)).ToArray();return true;}
}

但是,测试发现没有任何效果。

通过调用堆栈:

d01f6441605f27cd2ec2f7755503ca55.png

我们找到了查找静态 TryParse 方法的源代码:

private MethodInfo? GetStaticMethodFromHierarchy(Type type, string name, Type[] parameterTypes, Func<MethodInfo, bool> validateReturnType)
{bool IsMatch(MethodInfo? method) => method is not null && !method.IsAbstract && validateReturnType(method);var methodInfo = type.GetMethod(name, BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy, parameterTypes);

type.GetMethod方法是无法获取扩展方法的。

看来此路不通!

自定义类型

既然扩展方法不行,那只能使用定义了静态 TryParse 方法的自定义类型了:

public class DemoDto
{public int[] Array { get; set; }public static bool TryParse(string value, out DemoDto result){result = new DemoDto { Array = value.Trim('[', ']').Split(',').Select(str => int.Parse(str)).ToArray() };return true;}
}app.MapGet("/",(DemoDto values) =>
{return string.Join(" ", values.Array.Select(p => p.ToString()));
});

再次运行,执行成功:

d91edd13ed2e6a6cd2fd064d0fcc96a9.png

结论

对于路由、查询和标头绑定源,最小 API 通过类型的静态 TryParse 方法来绑定自定义类型。

TryParse 具有两个 API:

public static bool TryParse(string value, out T result);
public static bool TryParse(string value, IFormatProvider provider, out T result);

添加微信号【MyIO666】,邀你加入技术交流群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes api-server源码阅读2(Debug Kubernetes篇)

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes api-server源码阅读 系列第二篇&#xff0c;主要讲述如何实现 kubernetes api-server 的 debug 参考b站视频地址&#xff1a;Kubernetes源码开发之旅二 1.本篇章任务 Go-Delve&#xff1a;go语言的…

webrtc 视频 demo

webrtc 视频 demo webrtc网上封装的很多&#xff0c;demo很多都是一个页面里实现的&#xff0c;今天实现了个完整的 &#xff0c; A 发视频给 BA webrtc.html作为offer <!DOCTYPE html> <html id"home" lang"en"><head><meta http-e…

条件注释判断浏览器版本!--[if lt IE 9](转载)

<!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--> <!--[if IE]> 所有的IE可识别 <![endif]--> <!--[if IE 6]> 仅IE6可识别 <![endif]--> <!--[if lt IE 6]> IE6以及IE6以下版本可识别 <![endif]--> <!--[if …

[转]阿里开源低代码引擎LowCodeEngine

一、什么是低代码引擎 低代码引擎是具备强大扩展能力的低代码研发框架&#xff0c;使用者只需要基于低代码引擎便可以快速定制符合自己业务需求的低代码平台。同时&#xff0c;低代码引擎还在标准低代码设计器的基础上提供了简单易用的定制扩展能力&#xff0c;能够满足业务独特…

Beyond Istio OSS——Istio服务网格的现状与未来

作者&#xff1a;宋净超&#xff08;Jimmy Song&#xff09;&#xff0c;原文地址&#xff1a;https://jimmysong.io/blog/beyond-istio-oss/本文根据笔者在 GIAC 深圳 2022 年大会上的的演讲《Beyond Istio OSS —— Istio 的现状及未来》[1] 整理而成&#xff0c;演讲幻灯片见…

js多维数组扁平化

数组扁平化&#xff0c;就是将多维数组碾平为一维数组&#xff0c;方便使用。 一&#xff1a;例如&#xff0c;一个二维数组 var arr [a, [b, 2], [c, 3, x]]&#xff0c;将其扁平化&#xff1a; 1. 通过 apply 借用数组的 concat 方法&#xff1a; [].concat.apply([], arr)…

第16讲 用户程序的结构与执行

转载于:https://www.cnblogs.com/atuo/p/5609843.html

两种方法清除Excel保护密码

一、利用VBA脚本直接清除 打Excel&#xff0c;打开脚本编辑器&#xff08;AltF11&#xff09;或者如图&#xff0c;右键sheet名称 输入代码并运行&#xff0c;即可清除密码保护&#xff1a; Sub DeletePW()ActiveSheet.Protect DrawingObjects:True, Contents:True, AllowFil…

jsonp-反向代理-CORS解决JS跨域问题的个人总结

jsonp-反向代理-CORS解决JS跨域问题的个人总结 网上说了很多很多&#xff0c;但是看完之后还是很混乱&#xff0c;所以我自己重新总结一下。解决 js 跨域问题一共有8种方法&#xff0c; jsonp&#xff08;只支持 get&#xff09;反向代理CORSdocument.domain iframe 跨域windo…

URAL 1682 Crazy Professor (并查集)

【题目链接】 http://acm.timus.ru/problem.aspx?space1&num1682 【题目大意】 给出k&#xff0c;从1开始不断地加一并把这个数写在黑板上&#xff0c;如果写上的数字和之前的数字满足   (ab*b)%k0或者(ba*a)%k0就在他们之间连一条线&#xff0c;如果黑板上出现环就结束…

利用Python随机或暴力生成密码

""" Title: python 密码生成 Author: JackieZheng Date: 2022-04-09 12:47:33 LastEditTime: 2022-04-09 14:00:46 LastEditors: Please set LastEditors Description: FilePath: \\pythonCode\\python_pwd_generater.py """import itertools im…

EasyNetQ-用于使用 RabbitMQ 的 .NET API开源的工具库

Part1介绍EasyNetQ 的目标是提供一个库&#xff0c;用于在 .NET 中使用 RabbitMQ 尽可能简单。为了做到这一点&#xff0c;它通过强制执行一些简单的约定来以灵活性换取简单性。这些包括&#xff1a;消息应该由 .NET 类型表示。消息应按其 .NET 类型进行路由。这意味着消息是由…

python 中 __name__ 的使用

1. 如果模块是被导入&#xff0c;__name__的值为模块名字2. 如果模块是被直接执行&#xff0c;__name__的值为’__main__’Py1.py #&#xff01;/usr/bin/env python def test():print __name__ ,__name__ if __name__ __main__:test() Py2.py #&#xff01;/usr/bin/env pyt…

第6章 循环

6.1 range 函数用来创建一个数字列表&#xff0c;它的范围是从起始数字开始到结束数字之前 1 >>> for x in range(0,5): 2 print(Hello %s % x) 3 4 Hello 0 5 Hello 1 6 Hello 2 7 Hello 3 8 Hello 4 1 >>> print(list(range(10,20))) 2 [10, 11, 12, …

C# 实例解释面向对象编程中的依赖反转原则

在面向对象编程中&#xff0c;SOLID 是五个设计原则的首字母缩写&#xff0c;旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特C马丁(Robert Cecil Martin)提出的许多原则的子集&#xff0c;在他2000年的论文《设计原则与设计模式》中首次提出…

Linux学习笔记之一————什么是Linux及其应用领域

1.1认识Linux 1&#xff09;什么是操作系统 2&#xff09;现实生活中的操作系统 win7 Mac Android iOS 3&#xff09; 操作系统的发展史 &#xff08;1&#xff09;Unix 1965年之前的时候&#xff0c;电脑并不像现在一样普遍&#xff0c;它可不是一般人能碰的起的&#xff0c;…

Flex中宽度计算

flex 有三个属性值&#xff0c;分别是 flex-grow&#xff0c; flex-shrink&#xff0c; flex-basis&#xff0c;默认值是 0 1 auto。 发现网上详细介绍他们的文章比较少&#xff0c; 今天就详细说说他们&#xff0c;先一个一个看。 flex-grow 定义项目的放大比例&#xff0c;默…

Lucene详解

一.lucene原理 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包&#xff0c;是一个全文检索引擎的架构&#xff0c;提供了完整的查询引擎和索引引擎&#xff0c;部分文本分析引擎。它不是一个完整的搜索应用程序&#xff0c;而是为你的应用程序提供索引和搜索功能…

.NET 6.0中使用Identity框架实现JWT身份认证与授权

原文作者&#xff1a;Sarathlal Saseendran原文链接&#xff1a;https://www.c-sharpcorner.com/article/jwt-authentication-and-authorization-in-net-6-0-with-identity-framework/翻译&#xff1a;沙漠尽头的狼&#xff08;谷歌翻译加持&#xff09;介绍微软于 2021 年 11 …

adb devices 里面有很多 emulator-XXXX的解决方法

2019独角兽企业重金招聘Python工程师标准>>> adb kill-server 转载于:https://my.oschina.net/sfshine/blog/700354