2010-05-04 7 views
1

J'ai besoin d'un moyen sensé pour dessiner des fichiers texte arbitraires dans un programme C# et produire un objet de type anonyme arbitraire, ou peut-être un dictionnaire composite de quelque sorte.Création d'un objet de type anonyme à partir d'un fichier texte arbitraire

Je dispose d'un fichier de texte représentatif qui ressemble à ceci:

adapter 1: LPe11002 
    Factory IEEE: 10000000 C97A83FC 
    Non-Volatile WWPN: 10000000 C93D6A8A , WWNN: 20000000 C93D6A8A 
adapter 2: LPe11002 
    Factory IEEE: 10000000 C97A83FD 
    Non-Volatile WWPN: 10000000 C93D6A8B , WWNN: 20000000 C93D6A8B 

Y at-il un moyen d'obtenir ces informations dans un objet de type anonyme ou une structure similaire?

Le type anonyme final pourrait ressembler à quelque chose comme ça, si elle était composée en C# à la main:

new 
{ 
    adapter1 = new 
    { 
     FactoryIEEE = "10000000 C97A83FC", 
     Non-VolatileWWPN = "10000000 C93D6A8A", 
     WWNN = "20000000 C93D6A8A" 
    } 
    adapter2 = new 
    { 
     FactoryIEEE = "10000000 C97A83FD", 
     Non-VolatileWWPN = "10000000 C93D6A8B", 
     WWNN = "20000000 C93D6A8B" 
    } 
} 

Notez que, comme le contenu du fichier texte est arbitraire (les clés pourrait être quoi que ce soit) , une solution spécialisée (par exemple, qui recherche des noms tels que "FactoryIEEE") ne fonctionnera pas. Cependant, la structure du fichier sera toujours la même (c'est-à-dire indentation pour les groupes, les deux-points et les virgules comme délimiteurs, etc.).

Ou peut-être que je vais à ce sujet dans le mauvais sens, et vous avez une meilleure idée?

+0

Pourquoi voulez-vous d'utiliser des types anonymes pour cela? Pourquoi pas les types dynamiques? – Gabe

+0

Je n'avais pas pensé aux types dynamiques. C'est une bonne idée, mais malheureusement Mono est la plate-forme cible, donc la frappe dynamique n'est pas disponible. –

Répondre

4

Vous vous y trompez. Vos données "objet de type anonyme" est difficile à construire et difficile à utiliser. Pour le construire, vous devez utiliser la tromperie de réflexion. Et pour quoi?

Considérons une fonction PrintReport. Cette fonction ne serait pas plus simple à cause de l'utilisation d'ATO. Loin de là, ça devenait de plus en plus compliqué et lent, d'avoir à utiliser la réflexion elle-même pour parcourir les touches. Votre solution pourrait avoir avoir du sens s'il y avait un petit nombre fixe de clés possibles. Ensuite, une syntaxe d'utilisation telle que "obj.FactoryIEEE" pourrait avoir été préférée.

La façon dont je vais à ce sujet est un List<Dictionary<string, string>>, ou, disons un List<AdapterRecord> où AdapterRecord est

class AdapterRecord 
{ 
    public string Name { get; set; } 
    public Dictionary<string, string> Parameters { get; set; } 
} 
2

On dirait qu'il n'y a aucun moyen de le faire même en C# 4.

D'ailleurs, en y réfléchissant si vous ne savez pas ce que seront les clés, alors tout type d'accès fortement typé sera difficile, et une simple division + insertion en dictionnaire/liste/etc. aurait plus de sens.

+1

Oui, vous pouvez le faire avec le typage dynamique C#. – Strelok

+0

Malheureusement, strelokstrelok est correct. – kervin

+0

J'ai vérifié cependant. Vous ne pouvez pas accéder à ExpandoObject via l'index, il est donc impossible de définir par programme des valeurs sur un objet dont vous ne connaissez pas le nom avant son exécution. – RCIX

4

Consultez cet article en 2 parties. Il analyse les fichiers XML de manière fluide. Il peut être adapté pour analyser vos fichiers texte, je pense.

Il utilise le typage dynamique C# 4 pour faire ce que vous voulez.

+0

+1, c'est techniquement correct mais j'espère que je ne rencontrerai jamais ça. – kervin

+0

Très bien. Je suis sûr que je vais utiliser quelque chose comme ça finalement. –

+0

Désolé, j'ai oublié de mentionner que C# 4.0 n'est pas une option disponible. –

1

Bien que je ne DataTable un ne les aime, peut-être servir ...

+0

N'a pas pensé à ça. –