-2

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

当尝试将结果添加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);

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

4

5 回答 5

6

正如错误所说,您需要一个明确的演员表:

animals.Add( (Animal) new_animal);

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

于 2013-09-27T13:50:33.237 回答
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);
于 2013-09-27T13:51:20.157 回答
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,此方法不会将其添加到列表中并继续。

于 2013-09-27T13:56:40.377 回答
0

你这样做的方式是隐式转换。您应该改为显式转换。尝试:

object new_animal = (Animal) Activator.CreateInstance(animal_type);
于 2013-09-27T13:53:24.317 回答
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;
  }
于 2013-09-27T13:56:45.823 回答