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 de combien de façons il y a à faire c'est et de l'approche à utiliser dans le scénario.

exemples:

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

cette question n'est pas censée être une question ouverte. discussion parce que je suis sûr qu'il ya seulement tellement de façons cela peut être réalisé.

31
demandé sur peter-b 2012-03-24 23:41:01

2 réponses

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 est dans l'assemblage en cours d'exécution (cela peut être ajusté - il suffit de changer assembly à tout ce dont vous avez besoin)
  • il y a exactement une classe avec le nom que vous cherchez 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éfinis de la même assemblée):

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

    return assembly.GetTypes()
        .Where(baseType.IsAssignableFrom)
        .Where(t => baseType != t);
}
44
répondu GolfWolf 2012-03-25 17:01:10
Activator.CreateInstance(Type.GetType("SomeNamespace.SomeClassName"));

ou

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

il y a aussi des surcharges où vous pouvez spécifier des arguments de constructeur.

16
répondu Balazs Tihanyi 2012-03-24 20:21:07