2010-11-24 2 views
1

몇 가지 속성이있는 클래스가 있는데, 일부는 XML 주석 (요약)을 사용합니다. 내가하고 싶은 것은 응용 프로그램의 사용자에 대한 요약 정보를 표시하는 것입니다. 이렇게하려면 코드의 요약 텍스트에 액세스해야합니다. Label1.Text = ....... 어떻게하면됩니까? 의견이코드의 속성 요약에 액세스하는 방법은 무엇입니까?

답변

2

max는 매우 포괄적 인 답변을 제공했지만 필자는이 질문과 관련하여 편집 한 블로그 게시물을 추가 할 것이라고 생각했습니다. MemberInfo의 확장 방법을 사용하여 XML 주석을 읽는 솔루션을 제공합니다. 내 구현에서는 XDocument 및 XPath 쿼리를 사용하여 텍스트를 반환합니다. 메서드, 속성, 유형, 이벤트, 필드 및 메서드 매개 변수에서 작동합니다.

는 여기를 참조하십시오 : http://www.brad-smith.info/blog/archives/220

+1

ASP.NET 웹 사이트에서 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

이 불가능합니다. 말했듯이 이들은 주석이며 컴파일러에 의해 처리되지 않습니다.

그러나 자동 문서 생성에 사용할 수 있습니다. 당신이 당신의 속성을 주석하려면

은, 사용은 XML 주석이 EXE/DLL 파일을 결과에 포함되지

0

당신은 당신의 코드에서 XML 주석 정보를 액세스 할 수 없습니다 컴파일되지 않기 때문에

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

참고 MVC 프레임 워크에 포함이 one 같은 속성, 그래서 당신은 XML 파일을 생성 할 수 있도록해야합니다 그들도 배포하십시오. 속성을 사용하여 속성/메소드/클래스/기타에 대한 런타임에 사용 가능한 정보를 제공하는 속성을 사용하는 Consder. 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 파일.

포함 리소스로 XML 주석 파일을주게됩니다 :

  1. 디렉토리 (대신 빈/릴리스 또는 빈/디버그의) 프로젝트 프로젝트 속성에
  2. 세트 XML 출력 파일 경로를 XML 파일을 생성 할 수 있도록
  3. 프로젝트 탐색기에서
  4. 은 "모든 파일 표시"를 활성화하고 XML 파일을
  5. 열린 파일 속성을 생성 inlude 컴파일 프로젝트

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

    댓글을 XML 파일에서의 .resx 생성하려면 : 차 세트 빌드 작업을 "포함 리소스"

는 이제 XML 주석은이 방법을로드 할 수있는 자원으로 어셈블리 파일에 포함되어 있습니다 :

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

일이 실제로 수행 할 수 있음을 증명합니다. XmlDocument에서 XDocument로 옮길 것을 제안 할 것이다. 코드가 훨씬 적고 LINQ를 사용하여 쿼리 할 수 ​​있습니다. –

+0

NDoc과 같은 문서를 생성하고 응용 프로그램에서 동일한 정보를 사용하려는 경우 이것이 유일한 방법이라고 생각합니다. 어셈블리에 ~ 200 가지 유형이있는 경우 어떻게 수행 할 것이라고 생각하십니까? – Marty

+0

성능이 문제가되는 경우 응용 프로그램 시작시 XML 주석을 Dictionary 또는 이와 유사한 형식으로 캐싱 할 수 있습니다. – max

1

프로젝트 옵션에서 플래그를 검사하여 XML 문서를 생성 할 수 있습니다.

일반적인 XML 도구로 생성 된 파일을 구문 분석 할 수 있습니다.

유스 케이스에 따라 속성이 더 적합 할 수 있습니다. 그러나 귀하의 경우 그것은 쓸데없는 중복으로 이어질 것으로 보입니다.

그러나 둘 다 현지화에 다소 문제가 있습니다. 일반적으로 지역화 할 수있는 문자열은 소스가 아닌 별도의 파일에 저장해야합니다.

+0

글쎄, 한 번에 2 마리의 토끼를 쏴 보려고합니다. 응용 프로그램의 상태 표시 줄에 대한 대화식 "힌트"또는 추가 정보를 의미하며, SandCasle 또는 Ndoc을 사용하여 응용 프로그램의 설명서를 자동으로 생성합니다. 현지화 관련 질문에 전적으로 동의합니다. 그것에 대한 아이디어가 있습니까? – Marty

+0

스크립팅 문서를 위해 문서를 다시 사용하려고 시도하지 않는 한 (이 경우 현지화는 덜 중요합니다) 사용자와 코더의 설명서가 다를 수 있으므로 한 번에 두 마리 토끼를 쏘아도 효과가 없습니다. – CodesInChaos

관련 문제