Conversion de chaîne en

Je devrais vraiment être capable d’obtenir cela, mais je suis juste au point où je pense que ce serait plus facile à poser.

Dans la fonction C #:

public static T GetValue(Ssortingng value) where T:new() { //Magic happens here } 

Qu’est-ce qu’une bonne implémentation pour la magie? L’idée derrière cela est que j’ai XML à parsingr et les valeurs souhaitées sont souvent des primitives (bool, int, ssortingng, etc.) et c’est l’endroit idéal pour utiliser des génériques … mais une solution simple m’échappe pour le moment .

btw, voici un exemple du xml à parsingr

   PIANO A Yamaha piano  false true    PIANO_BENCH A black piano bench  true false www.yamaha.com    DESK_LAMP A Verilux desk lamp  true true 2    

Je suggère plutôt que d’essayer d’parsingr XML vous-même, vous essayez de créer des classes qui désérialiseraient du XML dans les classes. Je recommande fortement de suivre la réponse de bendewey.

Mais si vous ne pouvez pas faire cela, il y a de l’espoir. Vous pouvez utiliser Convert.ChangeType .

 public static T GetValue(Ssortingng value) { return (T)Convert.ChangeType(value, typeof(T)); } 

Et utiliser comme ça

 GetValue("12"); // = 2 GetValue("12/12/98"); 

Vous pouvez commencer avec quelque chose à peu près comme ceci:

 TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); if (converter != null) { return (T)converter.ConvertFrom(value); } 

Si vous devez parsingr des atsortingbuts qui sont des types spéciaux, comme des couleurs ou des chaînes de culture, vous devrez bien sûr créer des cas particuliers dans ce qui précède. Mais cela va gérer la plupart de vos types primitifs.

Si vous décidez de passer par la sérialisation à POCO (Plain CLR Object), il existe peu d’outils pouvant vous aider à générer vos objects.

  • Vous pouvez utiliser xsd.exe pour générer un fichier .cs basé sur votre définition XML
  • Il existe une nouvelle fonctionnalité dans l’ aperçu 2 du Kit de démarrage REST WCF , appelé Coller en HTML. Cette fonctionnalité est vraiment cool et vous permet de prendre un bloc de code HTML dans votre presse-papiers, puis, lorsque vous le collez dans un fichier cs, il convertit automatiquement le fichier XML en object CLR pour la sérialisation.

Pour que cela fonctionne correctement, votre méthode générique devra déléguer son travail réel à une classe dédiée.

Quelque chose comme

 private Dictionary _Deserializers; public static T GetValue(Ssortingng value) where T:new() { return _Deserializers[typeof(T)].GetValue(value) as T; } 

où _Deserializers est une sorte de dictionnaire où vous enregistrez vos classes. (évidemment, une vérification serait nécessaire pour s’assurer qu’un désérialiseur a bien été enregistré dans le dictionnaire).

(Dans ce cas, le où T: new () est inutile car votre méthode n’a pas besoin de créer d’object.

à nouveau avec la mise en garde que cela est probablement une mauvaise idée:

 class Item { public ssortingng ItemType { get; set; } public ssortingng Name { get; set; } } public static T GetValue(ssortingng xml) where T : new() { var omgwtf = Activator.CreateInstance(); var xmlElement = XElement.Parse(xml); foreach (var child in xmlElement.Descendants()) { var property = omgwtf.GetType().GetProperty(child.Name.LocalName); if (property != null) property.SetValue(omgwtf, child.Value, null); } return omgwtf; } 

essai:

 static void Main(ssortingng[] args) { Item piano = GetValue(@"   A Yamaha Piano asdf "); }