C#基于父类的params参数赋值问题:子类对象分配给类成员变量
解决方案:C#中用params传递子类对象并分配给工具箱成员
嘿,这个需求其实挺典型的,咱们可以根据你工具箱的实际使用场景,选择两种不同的实现方式:
方案一:固定成员变量,按类型匹配赋值
如果你的工具箱只需要存储几种固定的工具(比如就锤子和螺丝刀),可以给Toolbox类定义对应类型的成员变量,然后在构造函数里遍历传入的params数组,根据类型匹配赋值。
完整代码示例
public class Tool {} public class Hammer : Tool {} public class Screwdriver : Tool {} public class Toolbox { // 定义对应工具类型的成员变量 public Hammer Hammer { get; private set; } public Screwdriver Screwdriver { get; private set; } public Toolbox(params Tool[] tools) { foreach (var tool in tools) { // 用模式匹配判断类型,直接赋值给对应成员 if (tool is Hammer hammer) Hammer = hammer; else if (tool is Screwdriver screwdriver) Screwdriver = screwdriver; // 后续如果新增Tool子类,直接在这里加else if分支即可 } } }
使用方式
// 只传入锤子 var basicToolbox = new Toolbox(new Hammer()); // 传入锤子和螺丝刀 var fullToolbox = new Toolbox(new Hammer(), new Screwdriver());
注意点
- 如果传入多个同类型的工具(比如两个
Hammer),后面的会覆盖前面的赋值;如果不想覆盖,可以在赋值前加判断:if (Hammer == null) Hammer = hammer; - 这种方式类型安全,调用时能直接通过
Toolbox.Hammer获取对应工具,不用额外转换。
方案二:用集合存储,灵活获取工具
如果你的工具箱需要支持更多类型的工具,或者未来可能新增工具子类,用集合存储会更灵活。可以选择List<Tool>存储所有工具,或者用Dictionary<Type, Tool>按类型快速查找。
完整代码示例
public class Tool {} public class Hammer : Tool {} public class Screwdriver : Tool {} public class Toolbox { // 存储所有工具的列表 private readonly List<Tool> _allTools = new List<Tool>(); // 按类型存储工具的字典,方便快速查找单例工具 private readonly Dictionary<Type, Tool> _toolsByType = new Dictionary<Type, Tool>(); public Toolbox(params Tool[] tools) { foreach (var tool in tools) { _allTools.Add(tool); // 仅当该类型未存储时才添加,避免覆盖 if (!_toolsByType.ContainsKey(tool.GetType())) _toolsByType.Add(tool.GetType(), tool); } } // 泛型方法:根据类型获取工具 public T GetTool<T>() where T : Tool { return _toolsByType.TryGetValue(typeof(T), out var tool) ? tool as T : null; } // 获取所有工具的只读集合 public IEnumerable<Tool> GetAllTools() => _allTools.AsReadOnly(); }
使用方式
var toolbox = new Toolbox(new Hammer(), new Screwdriver()); // 获取锤子 var hammer = toolbox.GetTool<Hammer>(); // 获取螺丝刀 var screwdriver = toolbox.GetTool<Screwdriver>(); // 获取所有工具 var allTools = toolbox.GetAllTools();
注意点
- 如果需要存储多个同类型工具(比如两把锤子),可以把字典的 value 改成
List<Tool>,比如Dictionary<Type, List<Tool>>,然后在构造函数里追加到列表中。 - 这种方式扩展性极强,新增
Tool子类时完全不需要修改Toolbox的代码。
内容的提问来源于stack exchange,提问作者Mee
相关产品推荐
相关产品推荐

