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

C#如何根据类型字典动态创建对应子类的实例

解决方案

你可以通过.NET内置的反射API Activator.CreateInstance 实现动态实例化,修改后的方法代码如下:

public ItemClass CreateItem(string itemName)
{
    System.Type type = types[itemName];
    return (ItemClass)System.Activator.CreateInstance(type);
}

注意事项

  • 该实现要求所有的子类(WeaponClass/ConsumableClass/ResourceClass)都具备公共无参数构造函数,否则运行时会抛出构造方法找不到的异常。
  • 如果你需要给构造函数传入参数,可以直接把参数按顺序放到CreateInstance方法的后续入参里,示例:
    // 假设子类构造需要传入int类型的物品ID
    return (ItemClass)System.Activator.CreateInstance(type, 1002);
    
更高性能的优化方案

如果不想每次创建实例都支付反射开销,可以提前把构造逻辑缓存为委托,调整字典定义即可:

// 字典值改为返回ItemClass实例的委托
Dictionary<string, Func<ItemClass>> typeConstructors = new Dictionary<string, Func<ItemClass>>()
{
    { "Weapon", () => new WeaponClass() },
    { "Consumable", () => new ConsumableClass() },
    { "Resource", () => new ResourceClass() }
};

对应的创建方法可以简化为:

public ItemClass CreateItem(string itemName)
{
    return typeConstructors[itemName]();
}

这个方案编译期就能校验构造函数的合法性,没有运行时反射开销,性能更优。

内容的提问来源于stack exchange,提问作者Javier Riera Chirivella

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:06:03