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
相关产品推荐
相关产品推荐

