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);
}
Другие вопросы по тегам