2013-10-26 10 views
5

Derzeit, wenn ich eine Klassenart habe und wissen muss, ob die Klasse erstellt werden kann. Ich werde Activator.CreateInstance(type); anrufen und das Ergebnis wegwerfen.Testen Sie, ob eine Klassenart mit Activator instanziiert werden kann, ohne sie zu instanziieren.

Dies scheint sehr ineffizient und problematisch.

Gibt es eine alternative Möglichkeit zu bestätigen, dass ein Klassentyp für die aktuelle Anwendung instanziiert werden kann?

Ich muss diesen Test als Teil des Anwendungsstarts durchführen. Um sicherzustellen, dass jede Fehlkonfiguration frühzeitig erkannt wird. Wenn ich es belasse, bis eine Instanz der Klasse benötigt wird, dann kann der Fehler auftreten, wenn niemand da ist, um es zu reparieren.

Hier ist was ich jetzt mache.

 string className = string.Format("Package.{0}.{1}", pArg1, pArg2); 
     Type classType = Type.GetType(className); 
     if (classType == null) 
     { 
      throw new Exception(string.Format("Class not found: {0}", className)); 
     } 

     try 
     { 
      // test creating an instance of the class. 
      Activator.CreateInstance(classType); 
     } 
     catch (Exception e) 
     { 
      logger.error("Could not create {0} class.", classType); 
     } 

Antwort

6

Basierend auf was here gefunden werden kann, können Sie testen, ob der Typ einen parameterlosen Konstruktor enthält (standardmäßig wird der Unterricht, wenn sie nicht zur Verfügung gestellt), und ob der Typ ist nicht abstrakt:

if(classType.GetConstructor(Type.EmptyTypes) != null && !classType.IsAbstract) 
{ 
    //this type is constructable with default constructor 
} 
else 
{ 
    //no default constructor 
} 
1

Mithilfe von System.Runtime.Serialization.FormatterServices.GetUninitializedObject(type) wird das Objekt instanziiert, der Konstruktor wird jedoch nicht aufgerufen. Es rendert eine zerlegte Instanz der Klasse. Die Klasse muss zugänglich sein, oder es wird eine Ausnahme ausgelöst. Wenn Ihre Klasse einen ausführlichen Startup-Code enthält, kann dies die Effizienz verbessern.

+0

Dies ist ein guter Ansatz. Vielen Dank. – cgTag