.NET 6中如何实现类似Tuple.Create的Action/Func快捷创建方法?
在.NET 6(C# 10)中实现Action/Func的Create快捷创建方法
要实现类似Tuple.Create的快捷方式来创建Action和Func委托实例,核心是利用C#的类型推断特性,通过自定义静态类封装委托创建逻辑,避免显式声明泛型参数。具体实现如下:
一、实现Action的Create方法
系统的System.Action是委托类型,无法直接添加静态方法,我们可以创建同名静态类(注意命名空间隔离避免冲突),为不同参数个数的Action提供重载的Create方法:
namespace YourCustomNamespace { public static class Action { // 无参数Action public static System.Action Create(System.Action action) => action; // 1个参数的Action public static System.Action<T> Create<T>(System.Action<T> action) => action; // 2个参数的Action public static System.Action<T1, T2> Create<T1, T2>(System.Action<T1, T2> action) => action; // 依次添加到16个参数的重载(系统Action最多支持16个参数) public static System.Action<T1, T2, T3> Create<T1, T2, T3>(System.Action<T1, T2, T3> action) => action; // ... 按此模式补充剩余参数个数的重载 } }
二、实现Func的Create方法
同理,为Func委托创建同名静态类,覆盖不同参数个数+返回值的场景:
namespace YourCustomNamespace { public static class Func { // 无参数带返回值的Func public static System.Func<TResult> Create<TResult>(System.Func<TResult> func) => func; // 1个参数带返回值的Func public static System.Func<T, TResult> Create<T, TResult>(System.Func<T, TResult> func) => func; // 2个参数带返回值的Func public static System.Func<T1, T2, TResult> Create<T1, T2, TResult>(System.Func<T1, T2, TResult> func) => func; // 依次添加到16个参数的重载(系统Func最多支持16个参数+返回值) public static System.Func<T1, T2, T3, TResult> Create<T1, T2, T3, TResult>(System.Func<T1, T2, T3, TResult> func) => func; // ... 按此模式补充剩余参数个数的重载 } }
三、使用方式
引入自定义命名空间后,即可像Tuple.Create一样快捷创建委托:
using YourCustomNamespace; // 创建无参数Action Action.Create(() => Console.WriteLine("Hello World")); // 创建带1个参数的Action Action.Create((int num) => Console.WriteLine($"Number: {num}")); // 创建无参数Func(返回int) var getNumber = Func.Create(() => 42); Console.WriteLine(getNumber()); // 创建带1个参数的Func(输入string,返回int) var getLength = Func.Create((string str) => str.Length); Console.WriteLine(getLength("Test"));
关键说明
- 命名空间隔离:自定义的
Action/Func静态类要放在独立命名空间下,避免与System命名空间的委托类型冲突;使用时通过using引入自定义命名空间即可。 - 类型推断原理:这些
Create方法本质是身份函数,接受对应委托实例并返回自身。编译器会根据传入的lambda表达式自动推断委托泛型参数,省去显式写new Action<...>的繁琐。 - 重载覆盖:需要为系统支持的所有参数个数(0~16)编写对应重载,可借助代码生成工具批量生成,避免手动重复编写。
内容的提问来源于stack exchange,提问作者Sasino
相关产品推荐
相关产品推荐

