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("")
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.
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:
Assembly
en ce dont vous avez besoin)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);
}
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.