2016-03-23 2 views
0

У меня есть базовый класс (Baseclass), из которого я получил некоторые подклассы (Subclass1, Subclass2 и т. Д.). Для каждого подкласса, я хочу:Добавить анонимный объект подкласса в список базового класса

  • вызов конструктора с 'фиксированных' аргументов (arg1, arg2 и т.д.);
  • проверить, действительно ли экземпляр действителен (предположим, что существует общий метод IsValid); и
  • Добавить экземпляр в список объектов.

Далее следует отрывок кода:

subclassList = new List<Type>() 
{ 
    typeof(Subclass1), 
    typeof(Subclass1), 
    ... 
}; 
List<Baseclass> objectList = new List<Baseclass>(); 
foreach (Type subclass in subclassList) 
{ 
    ConstructorInfo[] constructorArray = subclass.GetConstructors(BindingFlags.Public); 
    object o = constructorArray[0].Invoke(new object[] { arg1, arg2, ... }); 
    if (((Baseclass)o).IsValid) 
    { 
     objectList.Add(Convert.ChangeType(o, subclass)); 
    } 
} 
+3

В чем проблема? –

+0

Это не работает – Massimiliano

ответ

0

который вы пытаетесь добавить элемент типа object на ваш ObjectList. Вы должны бросить преобразованный элемент в Baseclass для метода Add принять пройти компиляцию:

   var conv = Convert.ChangeType(o, subclass); 
       objectList.Add((Baseclass)conv); 
+0

Я хочу, чтобы петля на набор подклассов и сделать некоторые операции для каждого подкласса. Компилятор не «любит» строку «Добавить», потому что он не распознает o как экземпляр подкласса. – Massimiliano

+0

обновил мой ответ –

0

Convert.ChangeType не действительно необходимо в этом случае, вы просто нужен один бросок. Кроме того, если вам нужно вызвать конструктор, вы можете использовать класс Activator, что более удобно для этого случая, чем использование рефлексии.

Вот полный рабочий пример:

using System; 
using System.Collections.Generic; 

// some fake classes just so I can compile the example 
class Baseclass { 
    public bool IsValid { 
     get { return true; } 
    } 
} 
class Subclass1 : Baseclass { 
} 
class Subclass2 : Baseclass { 
} 

class Program { 

    static void Main(string[] args) { 

     var subclassList = new List<Type>() { 
      typeof(Subclass1), 
      typeof(Subclass1) 
     }; 
     List<Baseclass> objectList = new List<Baseclass>(); 
     foreach (Type subclass in subclassList) { 
      Baseclass newObject = (Baseclass)Activator.CreateInstance(subclass); 
      if (newObject.IsValid) { 
       objectList.Add(newObject); 
      } 
     } 

    } 
} 
Смежные вопросы