Quelqu'un peut-il expliquer le Activator.CreateInstance()
but en détail?
c#
.net
reflection
Tabriz Atayi
la source
la source
CreateInstance(Type type)
corresponde à laCreateInstance<T>()
surcharge.c#.net
façon de faireObject xyz = Class.forName(className).newInstance();
.Réponses:
Supposons que vous ayez une classe appelée
MyFancyObject
comme celle-ci ci-dessous:Il vous permet de tourner:
Dans
En utilisant
et peut ensuite faire des choses comme:
C'est son but. Il a également de nombreuses autres surcharges telles que la fourniture d'un
Type
nom de classe au lieu du nom de classe dans une chaîne. Pourquoi vous auriez un problème comme celui-là est une autre histoire. Voici quelques personnes qui en avaient besoin:la source
String ClassName = "My.Namespace.MyFancyObject";
).obj = (MyFancyObject)Activator.CreateInstance("MyAssembly", ClassName))
mais au lieu de lancer avec le type. Cast avec le type fait à partir du ClassName? Comme çaType type = Type.GetType(ClassName);obj = (type )Activator.CreateInstance("MyAssembly", ClassName))
?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 analysez ce fichier, vous pouvez avoir un élément comme celui-ci.
ce que vous pouvez faire maintenant est de créer dynamiquement les objets trouvés dans votre fichier de niveau.
Ceci est très utile pour créer des environnements dynamiques. Bien sûr, il est également possible de l'utiliser pour des scénarios de plugins ou d'addins et bien plus encore.
la source
Mon bon ami MSDN peut vous l'expliquer, avec un exemple
Voici le code au cas où le lien ou le contenu changerait à l'avenir:
la source
Vous pouvez également faire ceci -
la source
.Unwrap()
fait exactement et comment cela se rapporte à d'autres solutions?CreateInstance
endroit où il revientSystem.Runtime.Remoting.ObjectHandle
.Un bon exemple pourrait être le suivant: par exemple, vous avez un ensemble de Loggers et vous autorisez l'utilisateur à spécifier le type à utiliser dans le runtime via le fichier de configuration.
Ensuite:
OU un autre cas est celui où vous avez une fabrique d'entités communes, qui crée une entité, et est également responsable de l'initialisation d'une entité par les données reçues de DB:
(pseudocode)
la source
typeof(loggerType)
résultatsloggerType is a variable and used like a type
le
Activator.CreateInstance
méthode crée une instance d'un type spécifié à l'aide du constructeur qui correspond le mieux aux paramètres spécifiés.Par exemple, disons que vous avez le nom du type sous forme de chaîne et que vous souhaitez utiliser la chaîne pour créer une instance de ce type. Vous pouvez utiliser
Activator.CreateInstance
pour cela:Voici un article MSDN qui explique son application plus en détail:
http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
la source
new Foo()
. Je pense que le PO voulait un exemple plus réaliste.CreateInstance
est si vous ne connaissez pas le type d'objet que vous allez instancier au moment du design. Dans cet exemple, vous savez clairement qu'il est de typeFoo
puisque vous le convertissez en typeFoo
. Vous ne feriez jamais cela parce que vous pouvez simplement le faireFoo foo = new Foo()
.En vous basant sur deepee1 et ceci , voici comment accepter un nom de classe dans une chaîne, puis l'utiliser pour lire et écrire dans une base de données avec LINQ. J'utilise "dynamique" au lieu du casting de deepee1 car il me permet d'attribuer des propriétés, ce qui nous permet de sélectionner et d'opérer dynamiquement sur n'importe quelle table que nous voulons.
la source
Pourquoi l'utiliseriez-vous si vous connaissiez déjà la classe et alliez la lancer? Pourquoi ne pas le faire à l'ancienne et faire de la classe comme vous le faites toujours? Il n'y a aucun avantage à cela sur la façon dont cela se fait normalement. Existe-t-il un moyen de prendre le texte et de l'utiliser ainsi:
Si je sais déjà que c'est une pizza, il n'y a aucun avantage à:
mais je vois un énorme avantage à la méthode Magic si elle existe.
la source
Couplé à la réflexion, j'ai trouvé Activator.CreateInstance très utile pour mapper le résultat d'une procédure stockée à une classe personnalisée, comme décrit dans la réponse suivante .
la source