2010-11-24 5 views
1

J'ai une classe, avec peu de propriétés, où certains ont un commentaire XML (résumé). Ce que je veux faire est d'afficher les informations de synthèse pour l'utilisateur dans l'application. Donc, j'ai besoin d'accéder au texte de synthèse dans le code, pour être en mesure de faire: Label1.Text = ....... comment puis-je faire cela?Comment accéder au résumé de la propriété dans le code?

public class MyObject 
     { 
      public int ID { get; set; } 
      /// <summary> 
      /// very very very very extensive information about the city 
      /// </summary> 
      public string City { get; set; } 
      public DateTime Date { get; set; } 
      public int Value { get; set; } 
      public int DiffToPrev { get; set; } 
     } 



class Program 
    { 

     static void Main() 
     { 
      var a = new MyObject(); 
      var t = a.GetType().GetProperty("City"); 
      Console.WriteLine(t.................... 

Répondre

2

Bien que max ait fourni une réponse très complète, j'ai juste pensé que j'ajouterais un billet de blog que j'ai compilé en relation avec cette question. J'offre une solution qui utilise des méthodes d'extension sur MemberInfo pour lire les commentaires XML. Ma mise en œuvre utilise les requêtes XDocument et XPath pour renvoyer le texte. Cela fonctionne sur les méthodes, propriétés, types, événements, champs et paramètres de méthode.

Voir ici: http://www.brad-smith.info/blog/archives/220

+1

Si vous utilisez ceci dans votre site Web ASP.NET sur IIS Express, assurez-vous de détecter manuellement le chemin. Et si vous ciblez enum, assurez-vous d'utiliser GetMember. Par exemple: var path = Server.MapPath ("~/bin /" + typeof (YourEnumType) .Assembly.GetName(). Nom + ".xml"); var str = typeof (YourEnumType) .GetMember ("EnumMemberName") [0] .GetXmlDocumentation (chemin); – kape123

0

ce n'est pas possible parce que les commentaires ne sont pas compilés

0

Vous ne pouvez pas accéder à des informations de commentaire XML dans votre code. Comme dit, ce sont des commentaires, et ne sont pas traités par le compilateur.

Cependant, ils peuvent être utilisés pour générer une documentation automatique.

Si vous souhaitez annoter vos propriétés, utilisez des attributs comme celui-ci one inclus dans le framework MVC

6

Notez que les commentaires XML ne sont pas inclus dans le fichier résultant exe/dll, vous devez activer la génération de fichiers xml et distribuez-les aussi. Conservez des attributs pour fournir des informations disponibles sur vos propriétés/méthodes/classes/etc, car les commentaires XML n'ont probablement pas été conçus pour ce que vous essayez de faire.

Quoi qu'il en soit, les commentaires XML ont format suivant:

<?xml version="1.0"?> 
<doc> 
    <assembly> 
     <name><!-- assembly name here --></name> 
    </assembly> 
    <members> 
     <!-- ... --> 
     <member name="M:Full.Type.Name.PropertyName"> 
      <summary> 
      <!-- property summary here --> 
      </summary> 
     </member> 
     <!-- ... --> 
    </memebers> 
</doc> 

Donc, si vous voulez encore, vous devez charger votre fichier de commentaires XML et trouver le noeud XML décrivant votre propriété (code non testé, juste pour montrer l'approche):

var a = new MyObject(); 
var t = a.GetType().GetProperty("City"); 
string xmlMemberName = "M:" + a.FullName + t.Name; 
var xmlDoc = new XmlDocument(); 
xmlDoc.Load("you_xml_comments_file.xml"); 
var membersNode = xmlDoc.DocumentElement["members"]; 
string summary = ""; 
if(membersNode != null) 
{ 
    foreach(XmlNode memberNode in membersNode.ChildNodes) 
    { 
     if(memberNode.Attributes["name"].Value == xmlMemberName) 
     { 
      summary = memberNode["summary"].InnerText; 
      break; 
     } 
    } 
} 
Console.WriteLine(summary); 

Mise à jour: vous pouvez également inclure votre fichier de commentaires XML en tant que ressource incorporée de sorte que vous ne serez jamais oublier de le distribuer, ou même écrire un petit outil qui transforme fichier de commentaires XML dans .resx Reso XML urces fichier.

Démenés fichier de commentaires XML comme une ressource intégrée:

  1. permettent la génération de fichiers XML dans les propriétés du projet
  2. chemin du fichier de sortie XML
  3. définie au répertoire du projet (au lieu de bin/release ou bin/Debug)
  4. projet
  5. compilation
  6. dans l'explorateur de projet permettent « Afficher tous les fichiers » et inlude généré fichier xml
  7. propriétés de fichier ouvert un e l'action de construction mis à « embedded ressources »

Vos commentaires xml sont inclus dans le fichier de montage en tant que ressource un peut être chargé de cette façon:

XmlDocument doc; 
using(var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(
    "your_default_namespace" + "." + "your_xml_file_name.xml")) 
{ 
    doc.Load(stream); 
} 

Pour générer .resx des commentaires fichier XML:

.resx Format:

<root> 
    <!-- some header stuff which can be copy-pasted from any other valid .resx --> 
    <!-- ... --> 
    <data name="Your_Object_Full_Name_PropertyName" xml:space="preserve"> 
     <value><!-- summary here --></value> 
    </data> 
    <!-- ... --> 
</root> 

Les chaînes peuvent être chargées à partir de ce .resx en utilisant la classe ResourceManager.

+0

+1 pour prouver qu'il peut en effet être fait. Je suggère de passer de 'XmlDocument' à' XDocument'. Beaucoup moins de code et la possibilité d'interroger en utilisant LINQ. –

+0

Ouais, je suppose que c'est la seule approche si je veux générer de la documentation avec quelque chose comme NDoc et utiliser les mêmes informations dans l'application. Comment pensez-vous que cela fonctionnera si l'assemblage a ~ 200 types? – Marty

+0

Si les performances posent problème, vous pouvez mettre en cache les commentaires XML au démarrage de l'application dans Dictionary ou quelque chose comme ça. – max

1

Vous pouvez cocher un indicateur dans les options du projet pour générer une documentation XML.

Vous pouvez analyser le fichier généré avec les outils XML habituels.

En fonction des attributs du cas d'utilisation, un meilleur ajustement peut être nécessaire. Mais dans votre cas, cela semble mener à une redondance inutile.

Mais les deux sont un peu problématiques avec la localisation. Vous voulez généralement des chaînes localisables non dans la source, mais dans des fichiers séparés.

+0

Eh bien, j'essaie de tirer 2 lapins avec un tir. Signification interactif "astuces" ou des informations supplémentaires sur la barre d'état de l'application, et aussi une documentation Auto Générer pour l'application en utilisant SandCasle ou Ndoc. Totalement d'accord avec vous sur la question de la localisation Des idées à ce sujet? – Marty

+0

Sauf si vous essayez de réutiliser le document pour un document de script (dans ce cas, la localisation est moins importante), la documentation pour les utilisateurs et les codeurs sera probablement assez différente pour que deux lapins à la fois ne fonctionnent pas. – CodesInChaos

Questions connexes