2014-06-25 1 views
4

J'ai une requête LinqToXml suivante:Comment rendre dynamique un nom de propriété de type anonyme?

var linqDoc = XDocument.Parse(xml); 
    var result = linqDoc.Descendants() 
    .GroupBy(elem => elem.Name) 
    .Select(group => new 
    { 
     TagName = group.Key.ToString(), 
     Values = group.Attributes("Id") 
     .Select(attr => attr.Value).ToList() 
    }); 

Est-il possible d'une certaine manière à rendre le champ de mon type anonyme qu'il soit la valeur de la variable, afin qu'il puisse être aussi (ne fonctionne pas):

var linqDoc = XDocument.Parse(xml); 
    var result = linqDoc.Descendants() 
    .GroupBy(elem => elem.Name) 
    .Select(group => new 
    { 
    group.Key.ToString() = group.Attributes("Id") 
     .Select(attr => attr.Value).ToList() 
    }); 
+1

Vous voulez nommer dinamically les champs du type? Dites 'a' est une instance de ce type anonyme. Comment obtenez-vous la valeur de ce champ maintenant, si vous ne connaissez pas son nom? – dcastro

+1

Non *. Même si ce serait possible, comment auriez-vous accès au domaine? – sloth

+1

Envisagez d'utiliser 'Dictionary' à la place; il est facile de créer avec la méthode 'ToDictionary'. – sloth

Répondre

5

Non, même les types anonymes doivent avoir des noms de champs à la compilation. Il semble vouloir une collection de différents types, chacun avec des noms de champs différents. Peut-être que vous pourriez utiliser un Dictionary à la place?

var result = linqDoc.Descendants() 
         .GroupBy(elem => elem.Name) 
         .ToDictionary(
            g => g.Key.ToString(), 
            g => g.Attributes("Id").Select(attr => attr.Value).ToList() 
            ); 

Notez que les dictionnaires peuvent être sérialisé JSON facilement:

{ 
    "key1": "type1": 
      { 
       "prop1a":"value1a", 
       "prop1b":"value1b" 
      }, 
    "key2": "type2": 
      { 
       "prop2a":"value2a", 
       "prop2b":"value2b" 
      } 
} 
Questions connexes