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

WPF类库中调用带参数传入Task<bool>的解决方法(委托参数报错)

问题:类库中调用带参数的传入Task报错处理

当前场景是在WPF自定义窗口类库中,需要接收外部带参数的Task方法,在类库内部获取用户输入的密码后执行该Task进行验证,但调用时出现报错:'Delegate Func<Task<bool>>' does not take 1 arguments。具体场景代码如下:

  1. 外部待执行的Task方法:
public async Task<bool> Login(string _password)
{
   //... 密码验证逻辑
}
  1. 向类库传递Task的调用代码:
var _check = _myLibrary.ShowLogin(() => _myMethods.Login(string.Empty));
  1. 类库中LoginWindow的相关代码:
public partial class LoginWindow : Window
{
   public ShowLogin(Func<Task<bool>> _checkpassword)
   {
     CheckPassword = _checkpassword;
   }

   public Func<Task<bool>> CheckPassword{ get; set; }

   public MessageBoxResult Result { get; set; }

   private async void Btn_login_Click(object sender, RoutedEventArgs e)
   {
     var _check = await CheckPassword(Txt_password.Text); // 此处报错!

     if (!_check)
     {
       Result = MessageBoxResult.Cancel;
     }
     else
     {
       Result = MessageBoxResult.OK;
     }
           
     Close();
   }
}

解决方法

问题根源在于传递的Func<Task<bool>>是无参委托,但实际需要的是带string参数的委托类型。需要修改委托类型为Func<string, Task<bool>>,具体步骤如下:

1. 修改类库中LoginWindow的委托定义和构造函数

把Func<Task<bool>>替换为Func<string, Task<bool>>,让委托支持接收字符串参数:

public partial class LoginWindow : Window
{
   // 修改构造函数的参数类型
   public ShowLogin(Func<string, Task<bool>> _checkpassword)
   {
     CheckPassword = _checkpassword;
   }

   // 修改属性类型为带参数的委托
   public Func<string, Task<bool>> CheckPassword{ get; set; }

   public MessageBoxResult Result { get; set; }

   private async void Btn_login_Click(object sender, RoutedEventArgs e)
   {
     // 现在可正常传入密码参数调用
     var _check = await CheckPassword(Txt_password.Text); 

     if (!_check)
     {
       Result = MessageBoxResult.Cancel;
     }
     else
     {
       Result = MessageBoxResult.OK;
     }
           
     Close();
   }
}

2. 修改外部向类库传递Task的代码

无需提前传入空参数,直接传递方法引用即可,让类库在需要时传入真实密码:

// 直接传递Login方法的引用
var _check = _myLibrary.ShowLogin(_myMethods.Login);
// 或者用lambda表达式写法:
// var _check = _myLibrary.ShowLogin(password => _myMethods.Login(password));

修改完成后,类库内部就能正确接收用户输入的密码,传递给外部的Login方法执行验证逻辑,解决报错问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:35:01