C# Создайте производный класс из System.Type или имени класса, затем добавьте его в коллекцию базового класса.
Мне нужно создать производный объект класса либо из его System.Type, либо из его имени, полного сборки. Я знаю, что могу использовать что-то вроде:
Activator.CreateInstance(derivedClassType)
Проблема в том, что после создания мне также нужно добавить этот объект в коллекцию его базового класса. Если бы я создавал объект нормально, я не получаю ошибок, выполнив:
List<BaseClass> myObjects = new List<BaseClass>();
BaseClass obj = new DerivedClass();
myObjects.Add(obj);
Однако я не могу понять, как сделать то же самое с Активатором вместо обычного создания объекта. Я сохранил System.Type и имя класса и точно знаю, что класс является производным от базового класса. Есть ли способ сделать это?
2 ответа
// create an object of a known type
var someObject = Activator.CreateInstance(derivedClassType);
// get the base class of the known type
var baseType = derivedClassType.BaseType;
// create a type of a generic list
Type openListType = typeof(List<>);
// set the item type of the generic list type to the base stype
Type baseTypeListType = openListType.MakeGenericType(baseType);
// create an instance of the list
dynamic baseTypeList = Activator.CreateInstance(baseTypeListType);
// add
baseTypeList.Add(someObject);
Использование dynamic
позволяет вам НЕ использовать фактический базовый тип в вашем коде и избавляет вас от хлопот, связанных с использованием рефлексии, но вы рискуете нарушить предположения, такие как "Я уверен, что все эти типы происходят из одного базового класса, поэтому я не буду проверить это."
Метод Activator.CreateInstance возвращает только тип объекта. Вы должны вручную ввести его в базовый класс.
Попробуйте приведенный ниже код,
List<BaseClass> myObjects = new List<BaseClass>();
BaseClass baseClassObj = Activator.CreateInstance(derivedClassType) as BaseClass;
if(baseClassObj != null)
{
myObjects.Add(baseClassObj);
}