You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:06:17