XML 문서에서 일반 클래스 및 메서드를 참조하는 방법


198

xml 문서를 작성할 때 <see cref="something">something</see>물론 사용할 수 있습니다 . 그러나 제네릭 형식의 클래스 또는 메서드를 어떻게 참조합니까?

public class FancyClass<T>
{
  public string FancyMethod<K>(T value) { return "something fancy"; }
}

XML 문서를 어딘가에 쓰려고한다면 멋진 클래스를 어떻게 참조합니까? 어떻게 참조 할 수 FancyClass<string>있습니까? 방법은 어떻습니까?

예를 들어 다른 클래스에서의 인스턴스를 반환한다는 것을 사용자에게 알리고 싶었습니다 FancyClass<int>. 어떻게 크레프를 볼 수 있습니까?

답변:


257

방법을 참조하려면 :

/// <see cref="FancyClass{T}.FancyMethod{K}(T)"/> for more information.

3
그 답변에 감사드립니다! 실제로 <see>의 MSDN 페이지에서 누락되었습니다 : msdn.microsoft.com/en-us/library/acd0tfbe.aspx
joce

6
실제로 VS2010 툴팁에서도 작동한다고 생각합니다. 예를 들어 "FancyClass 1{T}.FancyMethod1 {K} (T)"
Stephen Drew

당신이 그것에 대해 무슨 뜻인지 확실하지 않습니다. 나는 그것들을 추가 할 필요가 없으며 항상 나를 위해 일했습니다. 작동하지 않는 구체적인 예가 있습니까? 그렇다면 어딘가에 게시 (또는 답변 자신을 제공합니다.)하시기 바랍니다
라세 V. 칼슨

@Lasse, 아래 Steve의 답변과 의견을 참조하십시오. 귀하의 답변에는 올바른 Intellisense 툴팁이 포함되어 있지 않습니다.
Jakub Januszkiewicz

43
/// <summary>Uses a <see cref="FancyClass{T}" /> instance.</summary>

BTW, .Net Framework 2.03.0 의 MSDN 설명서에 있지만 버전 3.5 에서는 사라졌습니다.


4
T의 특별한 인스턴스는 어떻습니까? 문자열처럼? 아마도 불가능할까요?
Svish

무슨 소리 야? 특정 버전을 선언 할 수 없으므로 참조 할 수 없습니다.
Lasse V. Karlsen

예를 들어 메서드가 예를 들어 List <string> 만 반환하는 경우 하지만 중요하지는 않습니다 :)
Svish

7
예, 또한 궁금했습니다. FancyClass {string}을 작성할 때는 리샵 어가 흔들리지 만 FancyClass {String}을 쓸 때는 아닙니다 ...
thinkbeforecoding

6
"Think Before Coding"에 의한 상기 관찰의 이유는 그것이 c # 별명과 함께 작동하지 않기 때문입니다. 예를 들어 , 대신 , 대신 Int32intSinglefloat
에을

27

TL; DR :

"어떻게 참조 FancyClass<T>합니까?"

   /// <see cref="FancyClass{T}"/>

"어떻게 FancyClass<T>.FancyMethod<K>(T value)?"

   /// <see cref="FancyClass{T}.FancyMethod{K}(T)"/>

"어떻게 참조 할 수 FancyClass<string>있습니까?"

   /// <see cref="SomeType.SomeMethod(FancyClass{string})"/>
   /// <see cref="FancyClass{T}"/> whose generic type argument is <see cref="string"/>

만약 동안 그의 서명을 포함하는 방법을 참조하는 FancyClass<string>(즉, 파라미터 입력 등)를 사용하면 없는 그러한 직접 범용 형 폐쇄 참조. 두 번째 예는 이러한 제한을 해결합니다. (이것은 정적 System.String.Concat(IEnumerable<string>)메소드 에 대한 MSDN 참조 페이지 에서 볼 수 있습니다 ). :

XML 문서 주석 cref규칙 :

  • 일반 유형 매개 변수 목록을{}<> 꺾쇠 괄호 대신 중괄호로 묶습니다. 후자로 탈출에서이 예비 부품을 &lt;하고 &gt;- 기억은, 문서 주석은 XML입니다!

  • 접두어 (예 :T: 유형, M:메소드, P:특성, F:필드)를 포함하면 컴파일러는 참조의 유효성 검증을 수행하지 않고 cref속성 값을 문서 XML 출력으로 바로 복사합니다 . 따라서 이러한 파일에 적용되는 특수한 "ID 문자열"구문 을 사용해야합니다. 항상 정규화 된 식별자를 사용하고 백틱을 사용하여 일반 유형 매개 변수 ( `n유형, ``n메소드)를 참조하십시오.

  • 접두어를 생략하면 일반 언어 이름 지정 규칙이 적용됩니다. using명령문 이있는 네임 스페이스를 삭제 하고 int대신 언어 유형 키워드를 사용할 수 있습니다 System.Int32. 또한 컴파일러는 참조가 올바른지 확인합니다.

XML 문서 주석 cref치트 시트 :

namespace X
{
    using System;

    /// <see cref="I1"/>  (or <see cref="X.I1"/> from outside X)
    /// <see cref="T:X.I1"/>
    interface I1
    {
        /// <see cref="I1.M1(int)"/>  (or <see cref="M1(int)"/> from inside I1)
        /// <see cref="M:X.I1.M1(System.Int32)"/>
        void M1(int p);

        /// <see cref="I1.M2{U}(U)"/>
        /// <see cref="M:X.I1.M2``1(``0)"/>
        void M2<U>(U p);

        /// <see cref="I1.M3(Action{string})"/>
        /// <see cref="M:X.I1.M3(System.Action{System.String})"/>
        void M3(Action<string> p);
    }

    /// <see cref="I2{T}"/>
    /// <see cref="T:X.I2`1"/>
    interface I2<T>
    {
        /// <see cref="I2{T}.M1(int)"/>
        /// <see cref="M:X.I2`1.M1(System.Int32)"/>
        void M1(int p);

        /// <see cref="I2{T}.M2(T)"/>
        /// <see cref="M:X.I2`1.M2(`0)"/>
        void M2(T p);

        /// <see cref="I2{T}.M3{U}(U)"/>
        /// <see cref="M:X.I2`1.M3``1(``0)"/>
        void M3<U>(U p);
    }
}

T부분 만 참조하는 방법 ?
nawfal

4
알아 낸 :<typeparamref name="T"/>
nawfal

21

지금까지 표시된 답변 중 어느 것도 나를 위해 완전히 작동하지 않습니다. ReSharper는 see 태그가 완전히 해결되지 않는 한 Ctrl+ 클릭 가능한 링크 (예 :)로 변환하지 않습니다 여기 이미지.

OP의 메소드가이라는 네임 스페이스에있는 경우 표시된 메소드에 대한 Test완전히 해결 된 링크는 다음과 같습니다.

<see cref="M:Test.FancyClass`1.FancyMethod``1(`0)"/>

해결할 수있을 때 클래스 유형 매개 변수 수 앞에 하나의 백틱이 있어야하고 메서드 유형 매개 변수 수 앞에 두 개의 백틱이 있어야하며 매개 변수는 적절한 수의 백틱이있는 인덱스가없는 0 매개 변수입니다.

따라서 FancyClass클래스 유형 매개 변수 FancyMethod가 하나 이고 유형 매개 변수 가 하나 있으며 FancyClass매개 변수 유형 의 오브젝트가 메소드에 전달됨을 알 수 있습니다.

이 예제에서보다 명확하게 볼 수 있듯이

namespace Test
{
    public class FancyClass<A, B>
    {
        public void FancyMethod<C, D, E>(A a, B b, C c, D d, E e) { }
    }
}

링크는 다음과 같습니다.

M:Test.FancyClass`2.FancyMethod``3(`0,`1,``0,``1,``2)

또는 "세 가지 형태 파라미터를 가지는 방법을 가지고 두 유형 매개 변수와 클래스 메소드 매개 변수가있는 곳 ClassType1, ClassType2, MethodType1, MethodType2, MethodType3"


추가 메모로, 나는이 문서가 어디에도 없다는 것을 알지 못했고 천재가 아닙니다. 컴파일러는 나 에게이 모든 것을 말했습니다. 테스트 프로젝트를 만들고 XML documentation을 활성화 한 다음 링크를 만들려는 코드를 삽입하고 XML 문서 주석의 시작 부분 ( ///) 을 추가하기 만하면됩니다 .

namespace Test
{
    public class FancyClass<T>
    {
        ///
        public string FancyMethod<K>(T value) { return "something fancy"; }
    }

    public class Test
    {
        public static void Main(string[] args) { }
    }
}

그런 다음 프로젝트를 빌드하면 출력 된 XML 문서 에 속성 아래의 doc-> members-> member요소에 링크가 포함됩니다 name.

<?xml version="1.0"?>
<doc>
    <assembly>
        <name>Test</name>
    </assembly>
    <members>
        <member name="M:Test.FancyClass`1.FancyMethod``1(`0)">

        </member>
    </members>
</doc>

3
특히 시행 착오를 거치지 않고 올바른 표기법을 찾는 트릭으로 인해 더 많은 투표가 이루어질 것입니다. 내 남자 Kudos
피터

10

Lasse와 TBC의 답변에서 더 :

/// <see cref="T:FancyClass`1{T}"/> for more information.

/// <see cref="M:FancyClass`1{T}.FancyMethod`1{K}(T)"/> for more information.

툴팁도 올바르게 제공하지만 버전은 중괄호로 렌더링합니다.


2
사용 CREF = "System.Collections.Generic.List 참조 < 1{T}"/>** causes a build-time warning: **XML comment on 'Blah' has syntactically incorrect cref attribute 'System.Collections.Generic.List> 1 <T를 하나이를 사용하는 방법에 정교하게시겠습니까? -
야쿱 Januszkiewicz

2
안녕하세요 Jakub, 이것은 실제로 작동하지 않는 것 같습니다. 툴팁을 올바르게 작동시킬 수있는 유일한 방법은 <see cref = "T : <fullTypeName>`1 {T}"/>입니다.
Stephen Drew

2
좋아, 나는 부분적으로 그것을 얻었다. 메소드 자체가 일반이 아닌 경우 (List <T> .Add ()와 같이) 다음과 같이 작동합니다. <see cref = "M : System.Collections.Generic.List`1 {T} .Add (T)"/> .
Jakub Januszkiewicz

1
나를 위해 일하지 않는 것 같습니다. 필자가 작성한 일반 확장 메소드 (ArrayList를 List <T>로 변환)의 주석 헤더에 <see cref = "M : System.Collections.Generic.List`1 {T}"/> 이 있지만 ReSharper는 플래그를 지정합니다. 구문 오류이므로 IntelliSense는 그대로 표시합니다. VS 2010 / R # 6.1.37.86
Mike Loux

8
아하! 내가 얻을 수 있었다 "</ ="System.Collections.Generic.List`1 T "CREF 참조> 대신 중괄호의 않았다 트릭을 그것은 전체 공간을 확장 않습니다 작업에 따라서를, T를 사용하여.. 네임 스페이스를 포함하지 않으면 트릭이 작동하지 않으므로 완벽하지는 않습니다.
Mike Loux

5
/// Here we discuss the use of <typeparamref name="TYourExcellentType"/>.
/// <typeparam name="TYourExcellentType">Your exellent documentation</typeparam>

3
다른 답변은 일반 클래스를 참조하는 방법을 다루고 있습니다.이 답변은 type 매개 변수를 자체적으로 참조하는 방법을 보여줍니다.
jrh

1
/// <see cref="FancyClass&lt;T>.FancyMethod&lt;K>(T)"/> for more information.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.