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

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

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

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

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



답변

방법을 참조하려면 :

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


답변

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

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


답변

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


답변

지금까지 표시된 답변 중 어느 것도 나를 위해 완전히 작동하지 않습니다. 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>


답변

Lasse와 TBC의 답변에서 더 :

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

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

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


답변

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


답변

/// <see cref="FancyClass&lt;T>.FancyMethod&lt;K>(T)"/> for more information.