Est-il un moyen de convertir une dynamique d'anonymes ou de l'objet à typage fort, a déclaré objet?
Si j'ai un objet dynamique, d'anonymes ou de l'objet pour que la matière, dont la structure correspond à celle d'un objet fortement typé, est-il .NET méthode pour construire un typés d'objet de l'objet dynamique?
Je sais que je peux utiliser LINQ dynamicList.Select(dynamic => new Typed { .... }
type de chose, ou je peux utiliser Automapper, mais je me demandais si il n'y a pas quelque chose de spécialement construit pour cela?
Vous devez vous connecter pour publier un commentaire.
Vous pourriez sérialiser à un format intermédiaire, juste pour désérialiser droit par la suite. Ce n'est pas la plus élégante ou efficace, mais il pourrait faire votre travail:
Suppose que c'est votre classe:
Et c'est votre anonyme exemple:
Vous pouvez sérialiser la version anonyme à un format intermédiaire, puis le désérialiser une fois encore à une version dactylographiée.
Noter que c'est en théorie possible avec n'importe quel sérialiseur/deserializer (XmlSerializer, la sérialisation binaire, d'autres json libs), aussi longtemps que l'aller-retour est synchrone.
Votre question se résume à la question: puis-je convertir un statiquement tapé variable dans une autre statiquement tapé variable (de différents héritage chaînes)? et la réponse, évidemment, est Pas.
Pourquoi est-ce que votre question de descendre à la question ci-dessus?
Donc, en fait, votre code est en relation avec la statiquement typé valeur attribuée à l'Objet, et considéré comme Dynamique au moment de la compilation. Par conséquent, le seul cas où vous pouvez convertir un typage statique de valeur dans un autre [sans réflexion], c'est quand ils font partie de la même chaîne d'héritage. Sinon, vous êtes lié à l'utilisation de la réflexion de façon explicite (écrite par vous) ou implicitement (écrit par MS avec Dynamique de l'utilisation).
En d'autres termes, le code suivant ne fonctionne que si la valeur affectée à la dynamique est une base ou d'un type dérivé de la Personne (inventé pour l'exemple):
C'est assez bien.
Juste de mentionner, vous pouvez copier les valeurs d'octet par octet avec un code d'accès à la mémoire d'adresses (comme en C++), mais pour moi, c'est rien de mieux que de réflexion.
Ici, nous pouvons convertir un objet anonyme de Dictionnaire
Vous pouvez également effectuer un cast d'un objet à l'aide de LINQ:
Si votre objet hérite de MarshalByRefObject vous pouvez utiliser RealProxy.
Une autre alternative est d'utiliser la Réflexion, mais vous pouvez être limité par des trucs pas marqué virtuel et/ou d'avoir à utiliser des interfaces. Vous pourriez aussi avoir copier les valeurs, en supposant que les propriétés sont l'écriture et le constructeur vide qui fonctionne pour votre cas.
La réponse exacte à votre question est non, il n'y a pas de moyen automatique pour traiter un objet dynamique en tant que type spécifique, sauf si elle est une instance de ce type, il n'existe aucune fonction automatique de copier les valeurs d'un dynamique/objet anonyme dans une instance d'une classe nommée.
L'exécution n'a aucune idée de ce qui se passe dans le constructeur ou comment la classe est mis en œuvre en interne, de sorte que toute installation de ce type pourrait faire exploser le type de sécurité hors de l'eau. Le point de l'ensemble de la dynamique est de permettre duck-typing/runtime/expédition, etc.
edit: Si j'ai mal compris la question, laissez-moi savoir, mais je suis en supposant que vous voulez traiter d'un objet dynamique, comme si c'était une instance de SomeType.
Dans mes propres projets, j'ai utilisé un Objet Mappeur de classe pour cette où il correspond à la propriété des noms pour l'écriture des propriétés identiques ou contrainte types, donc au moins je n'ai pas besoin d'écrire 10 000 lignes de texte standard, bien que ma source n'était pas dynamique, j'ai donc utilisé de la Réflexion.Emit/DynamicMethod considérablement accélérer.