9
votes

C # Détection de Anonymouspe Nouveau {Nom = Valeur,} et convertir en Dictionnaire

Je dois détecter si un objet a été créé anonymement comme neuf {nom = valeur,}

S'il s'agit d'un anonymoustype, il devrait ajouter des noms de propriétés / valeurs de ses propriétés dans un p> xxx Pré>

C'est ce que j'ai piraté ensemble moi-même: P>

Dictionary<string,object>


1 commentaires

Qu'essayez-vous d'accomplir cela? Quoi qu'il en soit, il doit y avoir une meilleure façon de le faire.


3 Réponses :


6
votes

Utilisez la nouvelle syntaxe d'initialisateur d'objet de collection au lieu d'un type anonyme: xxx


0 commentaires

2
votes

La détection d'un type anonyme est un petit dur; Pas au moins cela dépend de la langue! VB Anon-Types Ne regardez pas la même chose que c # anon-types. Je serais douteux de la logique que les actes varient différemment sur des types d'anon. Vous pouvez vérifier [compilergénéché] , mais notez qu'il ne veut pas dire "type anonyme" - il y en a d'autres qui font cela.

Personnellement, je ne distinguerais pas ce scénario.


0 commentaires

24
votes

Pour obtenir toutes les propriétés d'un objet, avec ses valeurs dans un dictionnaire code>, vous pouvez coupler la puissance de LINQ aux objets avec réflexion.

Vous pouvez utiliser le Enumérable.ToDictionary Méthode: P>

var dic = obj.GetType()
             .GetProperties()
             .ToDictionary(p => p.Name,  p=> p.GetValue(obj, null));


3 commentaires

Le problème est s'il ne peut qu'utiliser le dictionnaire en premier lieu, il serait énormément plus rapide sauf si Linq fait de la mise en cache folle sur cette requête, auquel cas il serait «seulement» être mesurablement plus rapide.


Et si je vois des propriétés "intrinsèques" comme "genericequalitycomerer", plutôt que des propriétés que j'ai explicitement déclarées? J'ai essayé getProperties (controlingflags.declaredonly) .


Weird, Nevermind - J'ai constaté que la méthode utilisant cette réflexion (elle-même dans une extension d'objet) s'est terminée en s'appuyant sur le résultat converti. Mon extension était donc appelée à un objet, puis sur le dictionnaire résultant.