web-dev-qa-db-fra.com

Instancier une classe à partir de son nom textuel

Ne me demandez pas pourquoi mais je dois faire ce qui suit:

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

Je veux savoir combien il y a de façons de le faire et quelle approche utiliser dans quel scénario.

Exemples:

  • Activator.CreateInstance
  • Assembly.GetExecutingAssembly.CreateInstance("")
  • Toute autre suggestion serait appréciée

Cette question n'est pas censée être une discussion ouverte car je suis sûr qu'il n'y a que de nombreuses façons d'y parvenir.

35
Raheel Khan

Voici à quoi peut ressembler la méthode:

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

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

    return Activator.CreateInstance(type);
}

Le code ci-dessus suppose que:

  • vous recherchez une classe qui se trouve dans l'assembly en cours d'exécution (cela peut être ajusté - changez simplement Assembly en ce dont vous avez besoin)
  • il y a exactement une classe avec le nom que vous recherchez dans cette assemblée
  • la classe a un constructeur par défaut

Mise à jour:

Voici comment obtenir toutes les classes qui dérivent d'une classe donnée (et sont définies dans le même assembly):

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

    return Assembly.GetTypes()
        .Where(baseType.IsAssignableFrom)
        .Where(t => baseType != t);
}
48
Cristian Lupascu
Activator.CreateInstance(Type.GetType("SomeNamespace.SomeClassName"));

ou

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

Il existe également des surcharges où vous pouvez spécifier des arguments de constructeur.

17
Balazs Tihanyi