2016-03-23 16 views
0

Ich habe eine Basisklasse (Basisklasse), von der ich einige Unterklassen abgeleitet habe (Subclass1, Subclass2, usw.). Für jede Unterklasse, ich will:Hinzufügen eines anonymen Unterklassenobjekts zu einer Basisklassenliste

  • Aufruf der Konstruktor mit 'festen' Argumente (arg1, arg2, etc.);
  • überprüfen, ob die Instanziierung gültig ist (angenommen, dass eine gemeinsame Methode IsValid ist); und
  • fügen Sie die Instanziierung zu einer Objektliste hinzu.

Hier folgt der Auszug aus dem Code:

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

Was ist das Problem? –

+0

Es funktioniert nicht – Massimiliano

Antwort

0

Sie versuchen, ein Element des Typs object in Ihr objektliste hinzuzufügen. Sie sollen die konvertierte Artikel zu Baseclass für die Add Verfahren gegossen nehmen die Zusammenstellung weitergeben müssen:

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

Ich möchte eine Reihe von Unterklassen Schleife und einige Operationen für jede Unterklasse. Der Compiler "mag" die Zeile "Hinzufügen" nicht, weil er o nicht als Instanziierung einer Unterklasse erkennt. – Massimiliano

+0

aktualisierte meine Antwort –

0

Convert.ChangeType ist nicht wirklich in diesem Fall erforderlich, würden Sie brauchen nur einen Guss. Wenn Sie einen Konstruktor aufrufen müssen, können Sie auch die Klasse Activator verwenden, was für diesen Fall bequemer ist als die Verwendung von Reflektion.

ist das komplette Arbeitsbeispiel:

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); 
      } 
     } 

    } 
} 
Verwandte Themen