L'instanciation d'objet anonyme à l'aide de C# initialiseur d'objet de syntaxe stockées dans la chaîne de
En utilisant le C# initialiseur d'objet de syntaxe je peux instancier un objet anonyme comme ceci:
object empData = new { name = "bob", age = 30, salary = 100000 };
Mais si j'ai l'initialiseur stockées dans une chaîne de caractères, par exemple:
string init = "{ name = \"bob\", age = 30, salary = 100000 }";
Quel est le meilleur moyen de convertir cette chaîne en une instance de l'objet?
OriginalL'auteur DSO | 2009-05-22
Vous devez vous connecter pour publier un commentaire.
Anonyme classes sont C# sucre syntaxique (voir la section Remarques ici). csc.exe crée une classe avec des champs privés et une propriété en lecture/écriture avec le type inféré à partir du contexte. Toutes les utilisations de l'objet sont, encore une fois, déduit.
Ce que cela signifie est que vous ne peut pas créer une classe anonyme au moment de l'exécution parce que le CLR voit de la même manière que toute autre classe (encore une fois, parce que c'est C# sucre syntaxique).
Ainsi, au lieu de:
Dictionary<string,object>
System.Reflection.Emit
pour créer le type au moment de l'exécution, mais je ne vois pas de réel avantage à ce plus simplement uneDictionary<string,object>
J'ai aussi des soucis de ce que vous faites parce que comme une chaîne de caractères très probable que signifie pour moi que vous êtes d'accepter la saisie de l'utilisateur. Méfiez-vous des problèmes de sécurité dans ce que vous faites.
Je suis totalement d'accord. J'aime utiliser XML d'un lot à l'aide de la réflexion pour faire quelques complexes xml personnalisé. Ce n'est pas pour tout le monde, mais si vous faites simple XML, puis à l'aide de l' .NET la sérialisation XML devrait suffire 😀
OriginalL'auteur Colin Burnett
Il n'est pas possible en utilisant les types anonymes, cependant vous pouvez le faire avec Réflexion Émettent à l'aide de la TypeBuilder classe, plus précisément TypeBuilder.Créer(..).
http://msdn.microsoft.com/en-us/library/system.reflection.emit.typebuilder.createtype.aspx
OriginalL'auteur BFree
La meilleure façon de le faire est d'utiliser la sérialisation. Mais bien sûr, ça ne veut pas utiliser le même format de chaîne de caractères que vous avez décrit.
Votre initialiseur d'objet ne doit pas contenir des valeurs constantes.
Donc, dans votre cas, vous devriez analyser les différents éléments de votre chaîne, et effectuer des conversions sur eux pour les contraindre à les types que vous voulez.
Si vous n'êtes pas marié à la chaîne de format, vous pouvez sérialiser et désérialiser des objets et faire la même chose à l'aide de XML beaucoup plus facilement.
OriginalL'auteur Robert Harvey
Il n'y a pas de direct moyen facile de le faire. Fondamentalement, vous avez les options suivantes:
Aucun n'est idéal, à mon avis. Je voudrais examiner QueryString comme des paires, XML ou JSON ou tout autre format qui a analyseurs disponibles là-bas à la place si vous avez la possibilité et envisager de stocker des données dans un dictionnaire de l'instance au lieu de créer un objet pour chaque expression.
OriginalL'auteur Mehrdad Afshari
Je ne pense pas que cette question répond le vôtre en soi, mais il vous dira pourquoi il n'est pas possible de créer anonyme des instances d'objets à l'aide de cordes, de telle manière que vous suggérez:
Comment puis-je créer et d'accéder à une nouvelle instance de la Classe Anonyme transmise en tant que paramètre en C#?
Les types anonymes n'ont pas de champs publics, par conséquent, tandis que vous pouvez le faire pour un objet nommé, il n'est pas si simple à faire pour un type anonyme. Cela dit, il n'y a rien pour vous empêcher de vous [tel que suggéré par alibres bd'agir] en utilisant la réflexion d'émettre le MSIL pour le type anonyme - qui n'est pas très simple, mais n'est pas impossible non plus.
OriginalL'auteur BenAlabaster