WPF类库中调用带参数传入Task<bool>的解决方法(委托参数报错)
问题:类库中调用带参数的传入Task报错处理
当前场景是在WPF自定义窗口类库中,需要接收外部带参数的Task方法,在类库内部获取用户输入的密码后执行该Task进行验证,但调用时出现报错:'Delegate Func<Task<bool>>' does not take 1 arguments。具体场景代码如下:
- 外部待执行的Task方法:
public async Task<bool> Login(string _password) { //... 密码验证逻辑 }
- 向类库传递Task的调用代码:
var _check = _myLibrary.ShowLogin(() => _myMethods.Login(string.Empty));
- 类库中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
相关产品推荐
相关产品推荐

