博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Action<T> 和 Func<T>的用法

Posted on 2025-04-24 23:14  火冰·瓶  阅读(32)  评论(0)    收藏  举报

在 C# 中,Action<T>Func<T> 都是 泛型委托,用于引用方法,但它们的主要区别在于 是否有返回值

Action<T> 用于 执行某个操作,但 不返回任何值

Func<T> 用于 执行某个操作并返回结果,最后一个参数是返回值

Action<string> logMessage = msg => Console.WriteLine($"日志: {msg}");
// 执行委托
logMessage("系统启动"); // 输出: 日志: 系统启动
//
//等同于
public void logMessage(string msg)
{
        Console.WriteLine($"日志: {msg}");
}


/*************************************************/

Action<string, int, long> logInfo = (message, code, timestamp) =>
{
          Console.WriteLine($"日志信息: {message}, 错误码: {code}, 时间戳: {timestamp}");
};

// 执行委托
logInfo("系统错误", 404, DateTimeOffset.UtcNow.ToUnixTimeSeconds());
//等同于
public void logInfo(string message, int  code, long timestamp)
{
         Console.WriteLine($"日志信息: {message}, 错误码: {code}, 时间戳: {timestamp}");
}

 

实例点典型应用一

类库中某个方法需要调用ILogger写入日志,但是ILogger是在Controller中依赖注入实例化,类库中无法调用,这个时候在类库中的这个方法上多加一个参数Action<string> log (可选参数Action<string>? log = null)

//假如类库中原方法为:
public void SendSms(string phone, string code)
{
}
//修改为:
public void SendSms(string phone, string code, Action<string>? log = null)
{
     //其他代码
     log("日志内容xxxx");
     //其他代码
}

//然后在Controller中定义个符合 Action<string>规范的方式如下:
private void Log(string msg)
{
       _logger.LogInfo(msg);
}

//原来的
SendSms(phone,code);
//修改为:
SendSms(phone, code, Log);
//或者直接用Lambda表达式简写
SendSms(phone, code, msg=>{_logger.LogInfo(msg);});

  

 

  

实例点典型应用二

静态类库AlibabaSMSService中定义了一个方法,包含Action<T>参数

//Action<SmsRecord> saveRecord,定义了一个saveRecord方法,有一个对象参数SmsRecord
   public void SendSms(string phone, string code, Action<SmsRecord> saveRecord)
   {
                SmsRecord smsRecord = new SmsRecord
                {
                    Code = code,
                    SendTime = DateTime.Now,
                    Phone = phone,
                    SignName = sendSmsRequest.SignName,
                    TemplateCode = sendSmsRequest.TemplateCode,
                    TemplateParam = sendSmsRequest.TemplateParam,
                    ResponseMsg = $"Message:{response.Body.Message},Code:{response.Body.Code}"
                };
                saveRecord(smsRecord);
   }

在Controller中调用  

                AlibabaSMSService.SendSms(tel, smsCode, 
                async x =>
                {
                    //这里x是SmsRecord,可以继续赋值
                    x.Ip = Request.HttpContext.Connection.RemoteIpAddress?.ToString() ?? "Unknown";
                    x.VisitId = _vistId;
                    x.SmsTypeStr=SmsType.RegisterCode.ToString();
                    await smsDAL.AddSmsRecord(x);  //smsDAL.AddSmsRecord(x)是异步方法
                }
                 );