2010-11-24 8 views
1

Ich habe eine Klasse, mit wenigen Eigenschaften, wo einige von ihnen einen XML-Kommentar (Zusammenfassung) haben. Was ich tun möchte, ist die Zusammenfassung Informationen für den Benutzer in der Anwendung anzuzeigen. Also muss ich auf zusammenfassenden Text im Code zugreifen, um zu tun: Label1.Text = ....... Wie mache ich das?Wie kann ich auf die Eigenschaftenzusammenfassung im Code zugreifen?

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.................... 

Antwort

2

Obwohl Max eine sehr umfassende Antwort gegeben hat, dachte ich nur, ich würde einen Blogbeitrag hinzufügen, den ich in Bezug auf diese Frage zusammengestellt habe. Ich biete eine Lösung, die Erweiterungsmethoden auf MemberInfo verwendet, um die XML-Kommentare zu lesen. Meine Implementierung verwendet XDocument und XPath-Abfragen, um den Text zurückzugeben. Es funktioniert mit Methoden, Eigenschaften, Typen, Ereignissen, Feldern und Methodenparametern.

Siehe hier: http://www.brad-smith.info/blog/archives/220

+1

Wenn Sie dies in Ihrer ASP.NET-Website unter IIS Express verwenden, stellen Sie sicher, dass Sie den Pfad manuell erkennen. Wenn Sie auf enum ausgerichtet sind, sollten Sie GetMember verwenden. Beispiel: var path = Server.MapPath ("~/bin /" + typeof (YourEnumType) .Assembly.GetName(). Name + ". Xml"); var str = typeof (YourEnumType) .GetMember ("EnumMemberName") [0] .GetXmlDocumentation (Pfad); – kape123

0

dies nicht möglich ist, weil Kommentare zusammengestellt werden nicht

0

Sie können keine XML-Kommentar Informationen im Code zugreifen. Wie gesagt, dies sind Kommentare und werden vom Compiler nicht verarbeitet.

Sie können jedoch verwendet werden, um automatische Dokumentation zu generieren.

Wenn Sie Ihre Eigenschaften zu annotieren wollen, Attribute verwenden wie dieses one im MVC-Framework enthalten

6

Beachten Sie, dass XML-Kommentare werden nicht in resultierende exe/dll-Datei enthalten, so dass Sie benötigen XML-Datei Generation ermöglichen und verteile sie auch. Consder verwendet Attribute, um runtime verfügbare Informationen über Ihre Eigenschaften/Methoden/Klassen/etc bereitzustellen, da XML-Kommentare wahrscheinlich nicht für das gedacht waren, was Sie versuchen zu tun.

Wie auch immer, XML-Kommentare haben folgendes Format:

<?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> 

Also, wenn Sie es immer noch wollen, müssen Sie Ihre XML-Kommentare Datei laden und XML-Knoten zu finden, Ihre Immobilie (ungetestet Kode, nur Ansatz zeigen,):

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); 

Update: Sie können auch Ihre XML-Kommentare Datei als Ressource eingebettet, so dass Sie es nie verteilen werden vergessen, oder sogar ein kleines Tool schreiben, die XML-Kommentare Datei in .resx verwandelt XML reso Urces-Datei.

Incuding XML-Kommentare Datei als eingebettete Ressource:

  1. XML-Datei Generation in Projekteigenschaften
  2. Satz XML-Ausgabedatei Pfad ermöglichen Verzeichnis zu projizieren (statt bin/Veröffentlichung oder bin/Debug)
  3. Kompilierung Projekt
  4. in Projekt-Explorer „alle Dateien anzeigen“ aktivieren und inlude xML-Datei
  5. offene Dateieigenschaften erzeugt ein nd gesetzt Build Aktion "Embedded Resource"

jetzt Ihre XML-Kommentare werden in der Montage-Datei enthalten als Ressource ein können auf diese Weise geladen werden:

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

Um .resx von Kommentaren XML-Datei zu generieren:

.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> 

Strings können geladen werden von dieser .resx mit ResourceManager Klasse.

+0

+1 zu beweisen, dass es in der Tat getan werden kann. Ich würde vorschlagen, von "XmlDocument" zu "XDocument" zu wechseln. Viel weniger Code plus die Möglichkeit, mit LINQ abzufragen. –

+0

Ja, ich denke, das ist der einzige Ansatz, wenn ich Dokumentation mit etwas wie NDoc generieren und die gleichen Informationen in der Anwendung verwenden möchte. Wie denken Sie, dass dies funktioniert, wenn die Baugruppe ~ 200 Typen hat? – Marty

+0

Wenn die Leistung ein Problem darstellt, können Sie XML-Kommentare beim Start der Anwendung in Dictionary oder ähnlichem zwischenspeichern. – max

1

Sie können eine Markierung in den Projektoptionen markieren, um eine XML-Dokumentation zu generieren.

Sie können die generierte Datei mit den üblichen XML-Tools analysieren.

Je nach Anwendungsfall passen die Attribute möglicherweise besser. Aber in Ihrem Fall scheint es zu nutzloser Redundanz zu führen.

Aber beide sind ein bisschen problematisch mit Lokalisierung. Normalerweise möchten lokalisierbare Zeichenfolgen nicht in der Quelle, sondern in separaten Dateien.

+0

Nun, ich versuche 2 Kaninchen mit einem Schuss zu schießen. Bedeutung interaktive "Hinweise" oder zusätzliche Informationen auf der Statusleiste der Anwendung, und auch eine Auto Generate-Dokumentation für die App mit SandCasle oder Ndoc. Stimmen Sie mit der Frage der Lokalisierung völlig überein. Irgendwelche Ideen dazu? – Marty

+0

Wenn Sie nicht versuchen, das Dokument für ein Skript-Dokument wiederzuverwenden (in diesem Fall ist die Lokalisierung auch weniger wichtig), ist die Dokumentation für Benutzer und Programmierer wahrscheinlich so unterschiedlich, dass das gleichzeitige Aufnehmen von zwei Hasen nicht funktioniert. – CodesInChaos

Verwandte Themen