在 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)是异步方法
}
);
浙公网安备 33010602011771号