2012-03-24 19 views
29

Non chiedetemi perché, ma ho bisogno di fare quanto segue:un'istanza di una classe dal suo nome testuale

string ClassName = "SomeClassName"; 
object o = MagicallyCreateInstance("SomeClassName"); 

Voglio sapere quanti modi ci sono per fare questo è e quale approccio di utilizzare in quale scenario.

Esempi:

  • Activator.CreateInstance
  • Assembly.GetExecutingAssembly.CreateInstance("")
  • Eventuali altri suggerimenti sarebbero apprezzati

Questa domanda non è pensato per essere una discussione a tempo indeterminato perché sono sicuro solo ci sono così tanti modi per raggiungere questo obiettivo.

+0

Un possibile duplicato di http://stackoverflow.com/questions/648160/how-do-i-create-an-instance-from-a-string-in-c –

+0

Hmm, quali sono le probabilità che è possibile indovinare il nome del suo spazio dei nomi in modo corretto? E l'assemblea da cui proviene? –

+0

L'assembly è di tipo già caricato o no? Se questo è qualcosa che si trova nei plugin, è possibile controllare MEF –

risposta

40

Ecco ciò che il metodo può apparire come:

private static object MagicallyCreateInstance(string className) 
{ 
    var assembly = Assembly.GetExecutingAssembly(); 

    var type = assembly.GetTypes() 
     .First(t => t.Name == className); 

    return Activator.CreateInstance(type); 
} 

Il codice di cui sopra assume che:

  • siete alla ricerca di una classe che è nel gruppo attualmente in esecuzione (questo può essere regolato - basta cambiare assembly per qualsiasi cosa sia necessaria)
  • c'è esattamente una classe con il nome che stai cercando in quell'assemblaggio
  • il c lass ha un costruttore di default

Aggiornamento:

Ecco come ottenere tutte le classi che derivano da una determinata classe (e sono definiti nello stesso assembly):

private static IEnumerable<Type> GetDerivedTypesFor(Type baseType) 
{ 
    var assembly = Assembly.GetExecutingAssembly(); 

    return assembly.GetTypes() 
     .Where(baseType.IsAssignableFrom) 
     .Where(t => baseType != t); 
} 
+0

Esattamente quello di cui avevo bisogno, grazie. Devo anche enumerare tutte le classi che derivano questa classe che abbiamo appena creato. Suppongo che 'assembly.GetTypes' lo consentirebbe. –

+1

@RaheelKhan Ho aggiunto un esempio di codice per ottenere le classi derivate definite nello stesso assembly. – GolfWolf

+0

Dopo aver ottenuto la classe, possiamo chiamare il metodo all'interno? – andrefadila

16
Activator.CreateInstance(Type.GetType("SomeNamespace.SomeClassName")); 

o

Activator.CreateInstance(null, "SomeNamespace.SomeClassName").Unwrap(); 

Esistono anche overload in cui è possibile specificare gli argomenti del costruttore.

Problemi correlati