C#如何通过存储类名的字符串变量动态实例化对应类对象
动态创建类实例的两种实现方案
你遇到的问题是C#不支持直接通过字符串类名调用new关键字创建实例,以下是两种可行的实现方案:
方案1:反射实现(适合类数量多、后续扩展频繁的场景)
你可以通过System.Activator类提供的方法动态加载类型并创建实例,步骤如下:
- 先修正原有代码的小错误:
textBoxName.ToString()会返回控件的类型描述字符串,需要改为textBoxName.Text才能正确获取用户输入的名称 - 引入命名空间
using System.Reflection; - 替换
btnCreateAnimal_Click中的实例化代码:
private void btnCreateAnimal_Click(object sender, EventArgs e) { bool gender = radioButtonMale.Checked; string name = textBoxName.Text; // 增加输入校验,避免年龄输入非数字报错 if(!int.TryParse(textBoxAge.Text, out int age)) { MessageBox.Show("请输入合法的年龄数字"); return; } // 替换为你项目中动物类所在的完整命名空间,比如你的类都在ZooApp.Entity下就写"ZooApp.Entity." string fullClassName = $"你的项目命名空间.{animal}"; Type animalType = Type.GetType(fullClassName); if(animalType == null) { MessageBox.Show("未找到对应的动物类,请检查类名配置"); return; } // 传入构造参数创建实例并转换为IAnimal接口 IAnimal AnyAnimal = (IAnimal)Activator.CreateInstance(animalType, name, age, gender); // 后续可以正常使用AnyAnimal对象 }
注意事项
- 必须填写正确的完整类名(命名空间+类名),如果动物类和当前代码不在同一个程序集,还需要在类名后追加程序集信息
- 所有动物类必须实现
IAnimal接口,否则强制转换会抛出运行时异常
方案2:工厂模式实现(更稳妥、性能更优,推荐优先使用)
如果你的动物类数量可控,更推荐用工厂模式实现,编译期即可检查错误,不会出现运行时类型找不到的问题:
- 新增一个静态工厂类:
public static class AnimalFactory { public static IAnimal CreateAnimal(string className, string name, int age, bool gender) { return className switch { nameof(King_penguin) => new King_penguin(name, age, gender), // 后续新增其他动物类,只需要在这里追加对应分支即可 _ => throw new ArgumentException($"不存在的动物类:{className}") }; } }
- 在
btnCreateAnimal_Click中直接调用工厂方法即可:
private void btnCreateAnimal_Click(object sender, EventArgs e) { bool gender = radioButtonMale.Checked; string name = textBoxName.Text; if(!int.TryParse(textBoxAge.Text, out int age)) { MessageBox.Show("请输入合法的年龄数字"); return; } IAnimal AnyAnimal = AnimalFactory.CreateAnimal(animal, name, age, gender); // 后续可以正常使用AnyAnimal对象 }
内容的提问来源于stack exchange,提问作者Alwin
相关产品推荐
相关产品推荐

