2011-11-09 1 views
3

Existe-t-il un moyen d'accéder aux propriétés d'un objet dynamique par index?C# DynamicObject: Existe-t-il un moyen d'accéder aux propriétés par index?

List<dynamic> list = _dataStagingManager.GetStatusList(consoleSearch); 
foreach (var row in list) 
{ 
    Console.WriteLine(row[0]); 
    Console.WriteLine(row[1]); 
} 

Dans cet exemple, le nom de la propriété de la ligne [0] est différent en fonction des résultats d'un alias de colonne de procédure stockée.

+0

De quel type d'objet dynamique s'agit-il? D'où l'obtenez-vous? – svick

+0

Initialement, j'utilisais le type d'objet dynamique général DynamicObject. Il s'avère que l'objet dynamique retourné par Dapper étend cet objet et inclut une propriété Keys and Values ​​ – Abe

Répondre

1

En général, ce n'est pas possible. Par exemple, vous pouvez créer un objet dynamique qui a tous les biens possibles:

class AnythingGoes : DynamicObject 
{ 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = binder.Name; 
     return true; 
    } 
} 

Il y a une chance que vous serez en mesure d'obtenir la liste des propriétés. Si l'objet dynamique est réellement un objet normal (un objet qui n'implémente pas IDynamicMetaObjectProvider), la réflexion normale fonctionnera correctement.

Si l'objet est en fait dynamique (outils IDynamicMetaObjectProvider), vous pouvez essayer d'appeler GetDynamicMemberNames() sur le DynamicMetaObject retourné de GetMetaObject(). Mais, comme le montre l'exemple ci-dessus, cela n'est pas garanti de fonctionner.

-2

Si le type d'exécution de row est doté d'un indexeur d'entiers, votre code doit être correct tel quel.

+1

Pouvez-vous donner un exemple de ceci? Fondamentalement, j'ai un objet de type Liste , qui contient un ensemble de résultats de données à partir d'une procédure stockée mappée par Dapper Dot Net. – Abe

+0

Je ne suis pas familier avec Dapper Dot Net. Mais, par exemple, si la ligne est un DataRow ADO.NET, la ligne d'expression [0] sera envoyée à l'indexation à l'exécution, ce qui retournera la valeur stockée dans la première colonne (et la ligne [1] la seconde, etc.) – phoog

4

Malheureusement, non. Contrairement aux objets d'exécution (qui ont une collection itérable de leurs membres qui peuvent facilement être reflétés/interrogés), les objets dynamiques, par défaut, ne possèdent pas une telle collection. Ils peuvent être mis en œuvre de manière à permettre à leurs membres d'accéder à leur nom. Il n'y a aucune idée d'index avec des objets dynamiques, à condition de ne pas choisir de les implémenter vous-même.

Si vous le souhaitez, vous pouvez remplacer la méthode TryGetIndex sur votre type dynamique pour fournir un support d'indexation.

+0

Bien sûr. «Malheureusement, non» ne semble pas être correct. Tout dépend de la façon dont vous codez votre objet dynamique. Voir ma réponse –

+0

Oui. Mais je pense que le PO cherchait un moyen * généraliste d'itérer les membres d'un objet dynamique (qu'il ne contrôle peut-être pas), ce qui est manifestement impossible. –

+0

Si oui, alors j'ai tort. Désolé pour downvote :( –

0

Je ne connais pas Dapper Dot Net mais après un bref coup d'oeil, il semble que les types anonymes retournent en tant qu'objets dynamiques. Vous pouvez les considérer comme des objets POCO (simples anciens objets CLR), ce qui signifie qu'ils sont des classes avec des propriétés nommées individuelles, sans implémenter aucun type d'indexeur dont vous auriez besoin pour accéder aux champs par index.

Vous pouvez essayer d'utiliser la réflexion pour parvenir quelque chose de similaire:

foreach (dynamic propInfo in row.GetType().GetProperties()) 
{ 
    Console.WriteLine("{0}: {1}", propInfo.Name, propInfo.GetValue(row, null)); 
} 

Je ne suis pas sûr que vous aurez les propriétés dans le même ordre la procédure stockée est leur retour, cependant.

+1

Dans votre exemple 'row.GetType()' renvoie null. –

Questions connexes