Instanciar uma class do seu nome textual

Não me pergunte por que, mas eu preciso fazer o seguinte:

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

Eu quero saber quantas maneiras existem para fazer isso e qual abordagem usar em qual cenário.

Exemplos:

  • Activator.CreateInstance
  • Assembly.GetExecutingAssembly.CreateInstance("")
  • Qualquer outra sugestão seria apreciada

Esta questão não pretende ser uma discussão aberta, porque tenho certeza de que só há muitas maneiras de conseguir isso.

Aqui está o que o método pode parecer:

 private static object MagicallyCreateInstance(string className) { var assembly = Assembly.GetExecutingAssembly(); var type = assembly.GetTypes() .First(t => t.Name == className); return Activator.CreateInstance(type); } 

O código acima assume que:

  • você está procurando por uma class que esteja na assembly atualmente em execução (isso pode ser ajustado – basta alterar a assembly para o que precisar)
  • existe exatamente uma class com o nome que você está procurando naquela assembly
  • a class tem um construtor padrão

Atualizar:

Veja como obter todas as classs que derivam de uma determinada class (e estão definidas no mesmo 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")); 

ou

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

Também há sobrecargas nas quais você pode especificar argumentos de construtor.