C#中多连接类型List的统一配置方案优化咨询
解决方案
针对不同连接类型配置参数异构的问题,以下是几种替代强制类型转换的实用方案:
方案1:封装配置类+泛型抽象方法
将每种连接的配置参数封装为独立类,在抽象基类中定义泛型Config方法,子类实现对应类型的配置逻辑,既保留统一接口,又适配不同参数需求。
// 抽象基类 public abstract class IConnection { public abstract void Connect(); public abstract void Config<TConfig>(TConfig config) where TConfig : class; } // TCP专属配置类 public class TCPConfig { public int IpAddress { get; set; } } // RS232专属配置类 public class RS232Config { public int BaudRate { get; set; } } public class TCP : IConnection { private int _ipAddress; public override void Config<TConfig>(TConfig config) { if (config is TCPConfig tcpConfig) { _ipAddress = tcpConfig.IpAddress; } else { throw new ArgumentException("TCP连接仅支持TCPConfig类型配置"); } } public override void Connect() { Console.WriteLine($"TCP连接,IP地址:{_ipAddress}"); } } public class RS232 : IConnection { private int _baudRate; public override void Config<TConfig>(TConfig config) { if (config is RS232Config rsConfig) { _baudRate = rsConfig.BaudRate; } else { throw new ArgumentException("RS232连接仅支持RS232Config类型配置"); } } public override void Connect() { Console.WriteLine($"RS232连接,波特率:{_baudRate}"); } } // 使用示例 List<IConnection> connectionList = new List<IConnection>(); connectionList.Add(new TCP()); connectionList.Add(new RS232()); connectionList[0].Config(new TCPConfig { IpAddress = 19216811 }); connectionList[1].Config(new RS232Config { BaudRate = 9600 }); connectionList[0].Connect(); connectionList[1].Connect();
优点:统一Config方法入口,避免大量类型判断;配置参数结构化,可读性强。
缺点:需额外定义配置类,调用时需确保传入正确配置类型。
方案2:构造函数注入配置
在创建连接实例时直接通过构造函数传入配置参数,取消单独的Config方法,符合对象初始化的单一职责原则。
public abstract class IConnection { public abstract void Connect(); } public class RS232 : IConnection { private readonly int _baudRate; // 构造函数直接接收配置 public RS232(int baudRate) { _baudRate = baudRate; } public override void Connect() { Console.WriteLine($"RS232连接,波特率:{_baudRate}"); } } public class TCP : IConnection { private readonly int _ipAddress; public TCP(int ipAddress) { _ipAddress = ipAddress; } public override void Connect() { Console.WriteLine($"TCP连接,IP地址:{_ipAddress}"); } } // 使用示例 List<IConnection> connectionList = new List<IConnection>(); // 创建实例时直接传入配置 connectionList.Add(new TCP(19216811)); connectionList.Add(new RS232(9600)); connectionList[0].Connect(); connectionList[1].Connect();
优点:代码最简洁,对象创建后直接处于可用状态,无额外配置步骤;避免类型转换和后续修改配置的风险。
缺点:仅适用于初始化后配置固定的场景,无法动态修改配置。
方案3:接口分离+类型模式匹配
为每种连接的配置定义专属接口,使用C#类型模式匹配替代强制转换,遵循接口分离原则且更安全。
public abstract class IConnection { public abstract void Connect(); } // TCP配置专属接口 public interface ITCPConfigurable { void Config(int ipAddress); } // RS232配置专属接口 public interface IRS232Configurable { void Config(int baudRate); } public class TCP : IConnection, ITCPConfigurable { private int _ipAddress; public void Config(int ipAddress) { _ipAddress = ipAddress; } public override void Connect() { Console.WriteLine($"TCP连接,IP地址:{_ipAddress}"); } } public class RS232 : IConnection, IRS232Configurable { private int _baudRate; public void Config(int baudRate) { _baudRate = baudRate; } public override void Connect() { Console.WriteLine($"RS232连接,波特率:{_baudRate}"); } } // 使用示例 List<IConnection> connectionList = new List<IConnection>(); connectionList.Add(new TCP()); connectionList.Add(new RS232()); // 模式匹配配置 foreach (var conn in connectionList) { switch (conn) { case ITCPConfigurable tcp: tcp.Config(19216811); break; case IRS232Configurable rs: rs.Config(9600); break; } } connectionList[0].Connect(); connectionList[1].Connect();
优点:每个接口仅负责单一功能,符合设计原则;模式匹配比强制转换更安全,编译器会检查类型匹配。
缺点:连接类型较多时switch语句会变长,但比逐一判断类型的写法更清晰。
内容的提问来源于stack exchange,提问作者Vladzzz
相关产品推荐
相关产品推荐

