Comment puis-je obtenir une valeur d'une propriété d'un type anonyme?
J'ai un datagrid peuplée par une requête Linq. Lorsque la ligne dans la grille de changements dont j'ai besoin pour définir une variable égal à l'une des propriétés de l'objet.
J'ai essayé...
var selectedObject = view.GetRow(rowHandle);
_selectedId = selectedObject.Id;
... mais le compilateur n'a pas de soins pour ce ("Embedded déclaration ne peut pas être une déclaration ou une déclaration intitulée").
Il semble que la propriété doit être facile d'accès. L'inspection de l'objet au cours de l'exécution montre toutes les propriétés j'attends, je ne sais pas comment y accéder.
Comment puis-je obtenir de l'accès à l'anonyme de propriété de l'objet?
Modifier pour les Précisions:
M'arrive d'être en utilisant DevExpress XtraGrid de contrôle. J'ai chargé ce contrôle avec une requête Linq qui était composé de plusieurs objets différents, donc les données ne sont pas vraiment conformes avec toute une classe j'ai déjà (c'est à dire, je ne peux pas lancer ce à quoi que ce soit).
Je suis en utilisant .NET 3.5.
Quand j'ai vue les résultats de la vue.GetRow(rowHandle) méthode-je obtenir un type anonyme qui ressemble à ceci:
{ ClientId = 7, ClientName = "ACME Inc.", Jobs = 5 }
Mon objectif est d'obtenir le ClientId de ce type anonyme, donc je ne peux faire d'autres choses (comme une charge d'un formulaire avec le client enregistrement).
J'ai essayé un couple de suggestions dans les premières réponses, mais a été incapable de se rendre à un point où je pourrais obtenir ce ClientId.
- Quel est le type exact de l'identificateur de "vue"?
- "Voir" est un contrôle GridView de DevExpress.
Vous devez vous connecter pour publier un commentaire.
Avez-vous déjà essayé d'utiliser la réflexion? Voici un exemple de code snippet:
Une solution générique pour obtenir la valeur d'un élément de données pour une clé donnée
Exemple:
L'un des problèmes avec les types anonymes, c'est qu'il est difficile de les utiliser entre les fonctions. Il n'y a aucun moyen de le "nom" d'un type anonyme et par conséquent, il est très difficile de fonte d'entre eux. Cela les empêche d'être utilisé comme le type de l'expression de tout ce qui apparaît dans les métadonnées et est défini par l'utilisateur.
Je ne peux pas dire exactement ce qui API que vous utilisez ci-dessus. Cependant, il n'est pas possible pour l'API pour revenir à une fortement typé type anonyme, je pense que selectedObject est tapé à l'objet. C# 3.0 et ci-dessous ne prend pas en charge dynamique un accès vous sera impossible d'accéder à l'Id de propriété, même si elle est disponible au moment de l'exécution.
Vous aurez besoin d'une des méthodes suivantes pour contourner ce
MODIFIER
Voici un exemple sur la façon de faire un hack anonyme de type cast
La raison pour laquelle il est hacky est qu'il est très facile de briser ce. Par exemple, dans la méthode où le type anonyme est créé à l'origine. Si j'ajoute une autre propriété que le type, il y le code ci-dessus va compiler, mais ne parviennent pas à l'exécution.
Vous pouvez utiliser le type dynamique de l'accès à des propriétés de types anonymes au moment de l'exécution, sans l'aide de la réflexion.
Lire plus sur le type dynamique ici: http://msdn.microsoft.com/en-us/library/dd264736.aspx
Lorsque je travaillais avec passant autour des types anonymes et en essayant de les reformuler j'ai finalement trouvé plus facile à écrire un wrapper qui s'occupait de travail avec l'objet. Voici un lien vers un billet de blog à ce sujet.
http://somewebguy.wordpress.com/2009/05/29/anonymous-types-round-two/
En fin de compte, votre code devrait ressembler à quelque chose comme ça.
Comme JaredPar deviné correctement, le type de retour de
GetRow()
estobject
. Lorsque vous travaillez avec des DevExpress de la grille, vous pouvez extraire la valeur désirée comme ceci:Cette approche a les mêmes inconvénients comme la "hacky anonyme de type jette" décrit avant: Vous avez besoin d'une magie chaîne de caractères pour l'identification de la colonne en plus d'un type de cast d'un objet à l'int.
DevExpress de xtraGridView a une méthode comme ceci GetRowCellDisplayText(int rowHandle, GridColumn colonne). Avec cette méthode, le code suivant renvoie l'id du type anonyme.
Si ce n'est pas de fournir une réponse à la question "Comment puis-je obtenir de l'accès à l'anonyme de propriété de l'objet?", il tente toujours de résoudre la cause racine du problème.
J'ai essayé cela avec devXpress version 11.1 et je peux voir que la question est posée, près de 2,5 ans. Éventuellement, l'auteur de la question peut avoir une solution de contournement ou de trouver la solution lui-même. Pourtant, je suis encore à répondre à de sorte qu'il pourrait aider quelqu'un.
Ce trompe peut-être (vous ne pouvez pas avoir assez de code), mais n'avez-vous pas besoin d'indice dans la ligne de sorte que vous choisissez la colonne que vous voulez? Ou si "Id" est la colonne que vous voulez, vous devriez être en train de faire quelque chose comme ceci:
C'est comment je voudrais saisir le contenu d'une colonne dans un datagrid. Maintenant, si la colonne elle-même est un type anonyme, alors je ne sais pas, mais si vous êtes juste à entrer un nom de colonne avec un type primitif, alors cela devrait fonctionner.
Espère que cette aide, je suis de passage dans une liste d'interface, dont j'ai besoin pour obtenir une liste distincte de. J'ai d'abord obtenir un type Anonyme liste, et puis je l'ai marcher pour les transférer à ma liste d'objet.
Vous pouvez faire une boucle à travers les propriétés d'un type anonyme comme ceci:
Si vous savez ce que vous faites et ne sont pas peur de faire des erreurs d'exécution lors de vos changements de code, vous pouvez lancer votre ligne de données comme
dynamic
:Pas au moment de la Compilation, la vérification. Mais il devrait fonctionner très bien.