我将阅读一个字符串输入,它将确定要创建的派生类的类型。然后,创建的对象将添加到基类对象列表中。
尝试将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);
如何将新创建的对象添加到列表中?
答案 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;
}