You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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"));

关键说明

  1. 命名空间隔离:自定义的Action/Func静态类要放在独立命名空间下,避免与System命名空间的委托类型冲突;使用时通过using引入自定义命名空间即可。
  2. 类型推断原理:这些Create方法本质是身份函数,接受对应委托实例并返回自身。编译器会根据传入的lambda表达式自动推断委托泛型参数,省去显式写new Action<...>的繁琐。
  3. 重载覆盖:需要为系统支持的所有参数个数(0~16)编写对应重载,可借助代码生成工具批量生成,避免手动重复编写。

内容的提问来源于stack exchange,提问作者Sasino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:35:29