You need to enable JavaScript to run this app. C#如何通过存储类名的字符串变量动态实例化对应类对象
优惠活动
大模型
产品
解决方案
定价
更多

C#如何通过存储类名的字符串变量动态实例化对应类对象

动态创建类实例的两种实现方案

你遇到的问题是C#不支持直接通过字符串类名调用new关键字创建实例,以下是两种可行的实现方案:

方案1:反射实现(适合类数量多、后续扩展频繁的场景)

你可以通过System.Activator类提供的方法动态加载类型并创建实例,步骤如下:

  1. 先修正原有代码的小错误:textBoxName.ToString()会返回控件的类型描述字符串,需要改为textBoxName.Text才能正确获取用户输入的名称
  2. 引入命名空间using System.Reflection;
  3. 替换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:工厂模式实现(更稳妥、性能更优,推荐优先使用)

如果你的动物类数量可控,更推荐用工厂模式实现,编译期即可检查错误,不会出现运行时类型找不到的问题:

  1. 新增一个静态工厂类:
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}")
        };
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 07:15:07