C# - 从string创建派生类实例,然后添加到基类列表

时间:2013-09-27 13:48:29

标签: c# list inheritance activator

我将阅读一个字符串输入,它将确定要创建的派生类的类型。然后,创建的对象将添加到基类对象列表中。

尝试将Activator.CreateInstance();的结果添加到列表中时,我得到:

Cannot implicitly convert type 'object' to 'Namespace.Animal'. An explicit conversion exists (are you missing a cast?)

我得到了以下内容:

List<Animal> animals;

Type animal_type = Type.GetType(class_name); // eg lion, tiger
object new_animal = Activator.CreateInstance(animal_type);

animals.Add(new_animal);

如何将新创建的对象添加到列表中?

5 个答案:

答案 0 :(得分:6)

如错误所示,您需要explicit cast

animals.Add( (Animal) new_animal);

new_animal的类型为object。所以,new_animal几乎可以是任何东西。编译器需要您明确告诉它采取危险的步骤,假设它是Animal类型。它本身不会做出这样的假设,因为它不能保证转换能够起作用。

答案 1 :(得分:3)

将Activator.CreateInstance的结果转换为Animal:

List<Animal> animals;

Type animal_type = Type.GetType(class_name); // eg lion, tiger
Animal new_animal = (Animal)Activator.CreateInstance(animal_type);

animals.Add(new_animal);

答案 2 :(得分:1)

要扩展其他答案,您需要先转换为Animal。但是,如果您不是100%确定每次获得一个来自Animal的课程,那么这是一个更好的检查方法。

Type animal_type = Type.GetType(class_name); // eg lion, tiger
object new_object = Activator.CreateInstance(animal_type);

Animal new_animal = new_object as Animal; //Returns null if the object is not a type of Animal

if(new_animal != null)
    animals.Add(new_animal);

如果传递给class_name的类型不是Animal的类型,其他答案将抛出异常,此方法不会将其添加到列表中并继续。

答案 3 :(得分:0)

你这样做是隐式投射。你应该强迫明确。尝试:

object new_animal = (Animal) Activator.CreateInstance(animal_type);

答案 4 :(得分:0)

正如其他人所说,你需要将你的对象转换为动物。但是您可能应该检查以确保在实例化对象之前,您正在创建的类型可以分配给Animal。

  public bool AddNewAnimal(List<Animal> animals, string className)
  {
     bool success = false;

     Type animalType = Type.GetType(className);
     if (typeof(Animal).IsAssignableFrom(animalType))
     {
        object newAnimal = Activator.CreateInstance(animalType);
        animals.Add((Animal)newAnimal);
        success = true;
     }

     return success;
  }