如何创建值指向成员函数的SortedList?(TcpClient异步通信场景)
用SortedList映射响应字符串到成员函数的正确实现
你的核心问题是没有正确使用委托来引用成员函数,而是错误地直接调用了方法。下面是修正后的实现方案:
1. 定义正确的SortedList类型
把SortedList<string, object>改为SortedList<string, Action<string>>,因为Action<string>正好匹配你的ProcessTime(string)方法签名(无返回值、接受一个string参数)。
2. 初始化方法映射
直接将方法组(方法名)添加到集合中,不需要额外调用:
private SortedList<string, Action<string>> functionList = new SortedList<string, Action<string>>(); private void InitializeList() { // 直接添加方法引用,不需要传参数 functionList.Add("Time", ProcessTime); functionList.Add("Date", ProcessDate); // 假设你还有ProcessDate方法 } private void ProcessTime(string reply) { Console.WriteLine($"处理时间响应: {reply}"); // 这里写具体的时间处理逻辑 } private void ProcessDate(string reply) { Console.WriteLine($"处理日期响应: {reply}"); // 这里写具体的日期处理逻辑 }
3. 使用映射处理仪器响应
当收到仪器返回的字符串后,直接通过键查找对应的委托并执行:
// 假设从TcpClient异步收到的响应字符串是response string response = "Time,2024-05-20 14:30:00"; // 这里可以根据实际响应格式提取键,比如分割字符串取第一个部分 string key = response.Split(',')[0]; if (functionList.TryGetValue(key, out Action<string> handler)) { // 调用对应的处理方法,传入完整响应 handler(response); } else { // 处理未匹配到的情况,比如默认逻辑或日志 Console.WriteLine($"未找到响应类型[{key}]的处理方法"); }
关键说明
- 委托
Action<string>是.NET内置的泛型委托,专门用于表示无返回值、接受一个string参数的方法,完美适配你的处理函数签名。 - 方法组(比如
ProcessTime)可以隐式转换为对应的委托类型,不需要手动创建委托实例。 - SortedList会按键的顺序排序,同时提供O(log n)的查找效率,适合处理大量有限的响应类型。
内容的提问来源于stack exchange,提问作者Part Time User
相关产品推荐
相关产品推荐

