Quelqu'un peut-il expliquer l'objectif Activator.CreateInstance()
en détail?
Réponses
Trop de publicités?Disons que vous avez une classe appelée "MyFancyObject" (comme celui ci-dessous
class MyFancyObject
{
public int A { get;set;}
}
Il vous permet de:
String ClassName = "MyFancyObject";
En
MyFancyObject obj;
À l'aide de
obj = (MyFancyObject)Activator.CreateInstance("MyAssembly", ClassName))
et peut ensuite faire des trucs comme:
obj.A = 100;
C'est le but. Il a aussi de nombreux autres surcharges comme la prestation d'un Type à la place du nom de la classe dans une chaîne de caractères. Pourquoi vous avez un problème comme ça, c'est une autre histoire. Voici quelques personnes qui en ont besoin:
Eh bien, je peux vous donner un exemple, pourquoi utiliser quelque chose comme ça. Pensez à un jeu où vous souhaitez stocker votre niveau et à vos ennemis dans un fichier XML. Lorsque vous analyser ce fichier, vous pouvez avoir un élément de ce genre.
<Enemy X="10" Y="100" Type="MyGame.OrcGuard"/>
ce que vous pouvez faire, c'est de créer dynamiquement les objets qui se trouvent dans votre fichier de niveau.
foreach(XmlNode node in doc)
var enemy = Activator.CreateInstance(null, node.Attributes["Type"]);
C'est très utile, pour la construction dynamique des environnements. Bien sûr, il est aussi possible d'utiliser ce Plugin ou de complément scénarios et beaucoup plus.
Mon bon ami MSDN peut vous expliquer, avec un exemple
Voici le code au cas où le lien ou le contenu changerait à l'avenir:
using System;
class DynamicInstanceList
{
private static string instanceSpec = "System.EventArgs;System.Random;" +
"System.Exception;System.Object;System.Version";
public static void Main()
{
string[] instances = instanceSpec.Split(';');
Array instlist = Array.CreateInstance(typeof(object), instances.Length);
object item;
for (int i = 0; i < instances.Length; i++)
{
// create the object from the specification string
Console.WriteLine("Creating instance of: {0}", instances[i]);
item = Activator.CreateInstance(Type.GetType(instances[i]));
instlist.SetValue(item, i);
}
Console.WriteLine("\nObjects and their default values:\n");
foreach (object o in instlist)
{
Console.WriteLine("Type: {0}\nValue: {1}\nHashCode: {2}\n",
o.GetType().FullName, o.ToString(), o.GetHashCode());
}
}
}
// This program will display output similar to the following:
//
// Creating instance of: System.EventArgs
// Creating instance of: System.Random
// Creating instance of: System.Exception
// Creating instance of: System.Object
// Creating instance of: System.Version
//
// Objects and their default values:
//
// Type: System.EventArgs
// Value: System.EventArgs
// HashCode: 46104728
//
// Type: System.Random
// Value: System.Random
// HashCode: 12289376
//
// Type: System.Exception
// Value: System.Exception: Exception of type 'System.Exception' was thrown.
// HashCode: 55530882
//
// Type: System.Object
// Value: System.Object
// HashCode: 30015890
//
// Type: System.Version
// Value: 0.0
// HashCode: 1048575
Un bon exemple pourrait être le suivant: par exemple, vous avez un ensemble de enregistreurs et vous autorisez l’utilisateur à spécifier le type à utiliser au moment de l’exécution via le fichier de configuration.
Ensuite:
string rawLoggerType = configurationService.GetLoggerType();
Type loggerType = Type.GetType(rawLoggerType);
ILogger logger = Activator.CreateInstance(typeof(loggerType)) as ILogger;
OU un autre cas où vous avez une fabrique d'entités communes qui crée une entité et également responsable de l'initialisation d'une entité à l'aide de données reçues de DB:
(pseudocode)
public TEntity CreateEntityFromDataRow<TEntity>(DataRow row)
where TEntity : IDbEntity, class
{
MethodInfo methodInfo = typeof(T).GetMethod("BuildFromDataRow");
TEntity instance = Activator.CreateInstance(typeof(TEntity)) as TEntity;
return methodInfo.Invoke(instance, new object[] { row } ) as TEntity;
}