2010-11-24 11 views
1

私はいくつかのプロパティを持つクラスを持ち、その中にはXMLコメント(要約)を持つものがあります。 私がしたいのは、アプリケーションのユーザの要約情報を表示することです。 できるように、コードの要約テキストにアクセスする必要があります:Label1.Text = ....... どうすればいいですか?コード内のプロパティの概要にアクセスするには?

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

答えて

2

maxは非常に包括的な答えを提供しましたが、私はこの質問に関連して編集したブログ記事を追加すると思っていました。 MemberInfoの拡張メソッドを使用してXMLコメントを読み取るソリューションを提供します。私の実装ではXDocumentとXPathクエリを使用してテキストを返します。これは、メソッド、プロパティ、型、イベント、フィールド、およびメソッドのパラメータで機能します。

はこちらをご覧ください:http://www.brad-smith.info/blog/archives/220

+1

ASP.NET WebサイトのIIS Expressでこれを使用している場合は、パスを手動で検出するようにしてください。また、enumをターゲットにしている場合は、必ずGetMemberを使用してください。例:var path = Server.MapPath( "〜/ bin /" typeof(YourEnumType).Assembly.GetName()。Name + "。xml"); var str = typeof(YourEnumType).GetMember( "EnumMemberName")[0] .GetXmlDocumentation(path); – kape123

0

コメントは

0

をコンパイルされませんので、これは、あなたのコード内のXMLコメントの情報にアクセスすることはできませんことはできません。前述したように、これらはコメントであり、コンパイラによって処理されません。

ただし、自動文書を生成するために使用できます。

あなたはあなたの特性に注釈を付ける場合は、使用は、XMLコメントをEXE/DLLファイルを結果に含まれていないので、あなたは、xmlファイルの生成を有効にする必要がありますことをMVCフレームワーク

6

注記に含まれ、このoneなどの属性それらを配布することもできます。属性を使用してコンシューマは、プロパティ/メソッド/クラス/ etcの実行時に利用可能な情報を提供します。XMLコメントはおそらくあなたがしようとしているもののために設計されていないからです。

とにかく

、XMLのコメントは以下のいるフォーマット:あなたはまだそれをしたい場合は、あなただけのアプローチを表示するには、あなたの財産(未テストコードを記述し、あなたのXMLコメントファイルをロードして、XMLノードを見つける必要があるので、

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

):

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

更新:あなたがの.resxにXMLコメントファイルを変換小さなツールを、それを配布することを忘れない、あるいは書き込み決してので、あなたはまた、埋め込まれたリソースとしてあなたのXMLコメントファイルを含めることができますXML reso urcesファイル。 (代わりにビン/リリースまたはbinに/デバッグの)ディレクトリを投影する

  1. プロジェクトのプロパティでXMLファイルの生成を有効セットXML出力ファイルのパス:埋め込まれたリソースとしてXMLコメントファイルをIncuding

    プロジェクトエクスプローラで

  2. コンパイルプロジェクト
  3. A
  4. 開いているファイルのプロパティを「すべてのファイルは、ショー」を有効にして生成されたXMLファイルをinlude ND「埋め込まれたリソース」に設定し、ビルドアクション

は、今すぐあなたのXMLコメントは、この方法をロードすることができるリソースとしてアセンブリファイルに含まれています:

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

コメントXMLファイルからの.resx生成するには:

の.resx形式:

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

文字列をロードすることができますこの.resxからResourceManagerクラスを使用してください。

+0

+1、それが実際に行うことができることを証明します。しかし、 'XmlDocument'から' XDocument'に移行することを提案します。ずっと少ないコードとLINQを使って問い合わせる能力 –

+0

ええ、私はNDocのようなものでドキュメンテーションを生成し、アプリケーションで同じ情報を使用したい場合、これが唯一のアプローチだと思います。 アセンブリが〜200種類ある場合、これはどのように実行されると思いますか? – Marty

+0

パフォーマンスが問題になる場合は、アプリケーションの起動時にDictionary などのXMLコメントをキャッシュできます。 – max

1

プロジェクトオプションでフラグをチェックすると、XMLドキュメントを生成できます。

生成されたファイルを通常のXMLツールで解析できます。

ユースケースの属性に応じて、属性が適切になる場合があります。しかし、あなたの場合、それは無駄な冗長性につながるようです。

しかし、どちらもローカリゼーションには問題があります。通常、ローカライズ可能な文字列はソース内ではなく、別々のファイルに置きます。

+0

私はワンショットで2匹のウサギを撃つことを試みています。アプリケーションのステータスバーに関するインタラクティブな「ヒント」や追加情報を意味し、SandCasleやNdocを使用してアプリケーションのドキュメントを自動生成することもできます。 ローカリゼーションの問題について完全にあなたに同意します。それについてのアイデアは? – Marty

+0

ドキュメンテーションをスクリプティング用に再利用しようとしない限り(その場合、ローカリゼーションの重要性はそれほど重要ではありません)、ユーザとコーダのドキュメントは、おそらくは2人のウサギを一度に撮影することはできません。 – CodesInChaos

関連する問題