C# WinForms重构:接口实现类变量无值问题求助
问题解决思路
1. 核心问题:未传递路径到接口实例
你在窗体中给自身的strPath赋值,但实例化cl_CheckForDriveSelected后,没有把窗体的strPath传递给这个实例的strPath属性,所以类中的strPath始终是默认的null值。
修复方法:在调用方法前,把窗体的路径赋值给接口实例的属性:
IAbsolutePath WasDriveSelected = new cl_CheckForDriveSelected(); // 新增这一行,传递选中的路径 WasDriveSelected.strPath = strPath; bool bolDriveLetter = WasDriveSelected.CheckForDriveSelected();
2. 方法逻辑错误:循环提前返回
你的CheckForDriveSelected方法存在逻辑漏洞:第一次循环时,如果当前驱动器不匹配,就直接return false,不会检查剩下的驱动器。比如用户选了D盘,但第一个循环检查的是C盘,就直接返回false,不会验证D盘是否是根目录。
修正后的方法:遍历所有驱动器,找到匹配项再返回;遍历完无匹配才返回false:
public bool CheckForDriveSelected() { DriveInfo[] drives = DriveInfo.GetDrives(); foreach (var drive in drives) { // 注意:DriveInfo.Name返回带反斜杠的路径(如"C:\"),需保证和选中路径格式一致 if (strPath.Equals(drive.Name, StringComparison.OrdinalIgnoreCase)) { var strMsgBoxTitle = "Select a folder for input"; var strMsgBoxMsg = "You must choose a folder and not a drive letter." + "\n" + "Please make another selection"; MessageBox.Show(strMsgBoxMsg, strMsgBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return true; } } // 遍历完所有驱动器都无匹配,说明不是根目录 return false; }
3. 接口设计优化建议
当前接口依赖属性传递参数,更合理的做法是把路径作为方法参数传入,避免依赖实例状态,代码更简洁可控:
// 优化后的接口 public interface IAbsolutePathChecker { bool CheckForDriveSelected(string strPath); } // 实现类 class cl_CheckForDriveSelected : IAbsolutePathChecker { public bool CheckForDriveSelected(string strPath) { DriveInfo[] drives = DriveInfo.GetDrives(); foreach (var drive in drives) { if (strPath.Equals(drive.Name, StringComparison.OrdinalIgnoreCase)) { var strMsgBoxTitle = "Select a folder for input"; var strMsgBoxMsg = "You must choose a folder and not a drive letter." + "\n" + "Please make another selection"; MessageBox.Show(strMsgBoxMsg, strMsgBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return true; } } return false; } } // 窗体调用代码 private void btn_SelectInput_Click_1(object sender, EventArgs e) { if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) { txb_InputFolderPath.Text = folderBrowserDialog1.SelectedPath; string selectedPath = txb_InputFolderPath.Text; IAbsolutePathChecker checker = new cl_CheckForDriveSelected(); bool isDriveRoot = checker.CheckForDriveSelected(selectedPath); } }
这种设计让接口职责更清晰,实例无需维护状态,也从根源避免了忘记赋值属性的问题。
内容的提问来源于stack exchange,提问作者OldAndRetired
相关产品推荐
相关产品推荐

