Crea un’istanza di una class dal suo nome testuale

Non chiedermi perché, ma ho bisogno di fare quanto segue:

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

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

Esempi:

  • Activator.CreateInstance
  • Assembly.GetExecutingAssembly.CreateInstance("")
  • Qualsiasi altro suggerimento sarebbe apprezzato

Questa domanda non intende essere una discussione aperta perché sono sicuro che ci sono solo tanti modi in cui questo può essere raggiunto.

    Ecco come può apparire il metodo:

     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 sopra presuppone che:

    • stai cercando una class che si trova nell’assembly attualmente in esecuzione (questa può essere modificata, basta cambiare l’ assembly alle tue esigenze)
    • c’è esattamente una class con il nome che stai cercando in quell’assemblea
    • la class ha un costruttore predefinito

    Aggiornare:

    Ecco come ottenere tutte le classi che derivano da una determinata class (e definite nello stesso assembly):

     private static IEnumerable GetDerivedTypesFor(Type baseType) { var assembly = Assembly.GetExecutingAssembly(); return assembly.GetTypes() .Where(baseType.IsAssignableFrom) .Where(t => baseType != t); } 
     Activator.CreateInstance(Type.GetType("SomeNamespace.SomeClassName")); 

    o

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

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