Как ссылаться на общие классы и методы в 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>. Как я могу сделать вид крепости для этого?

Ответ 1

Чтобы ссылаться на метод:

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

Ответ 2

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

BTW, он присутствовал в документации MSDN .NET Framework 2.0 и 3.0, но он исчез в версия 3.5

Ответ 3

Ни один из ответов, показанных до сих пор, не работает полностью для меня. ReSharper не будет конвертировать тег see в ссылку Ctrl + clickable (например, image here), если он полностью не разрешит.

Если метод в OP находился в пространстве имен, называемом Test, полностью разрешенная ссылка на показанный метод:

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

Как вы можете быть в состоянии работать, должна быть только одна обратная сторона перед числом параметров типа класса, а затем два обратных цикла перед числом параметров типа метода, тогда параметры являются параметрами с индексом 0 с соответствующим номером обратных ссылок.

Итак, мы можем видеть, что FancyClass имеет 1 тип типа класса, 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)

Или 'Class with 2 type parameters, который имеет method with 3 type parameters, где параметры метода ClassType1, ClassType2, MethodType1, MethodType2, MethodType3)


В качестве дополнительной заметки я не нашел этого документально нигде, и я не гений, компилятор рассказал мне все это. Все, что вам нужно сделать, это создать тестовый проект, включить документацию по XML, затем вставить код, для которого вы хотите найти ссылку, и поместить начало комментария 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-документация включает ссылку в элементе docmembersmember под атрибутом name:

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

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

Ответ 4

В дополнение к ответам Лассе и T.B.C:

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

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

также обеспечит всплывающие подсказки правильно, в то время как их версия отображает их с фигурными фигурными скобками.

Ответ 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> (например, как тип параметра), вы не можете напрямую ссылаться на такой закрытый общий тип. Второй пример работает с этим ограничением. (Это видно, например, на странице MSDN refence для статического метода System.String.Concat(IEnumerable<string>)).

Комментарий к документации по XML cref:

Комментарий к документации по XML cref cheat sheet:

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

Ответ 6

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

Ответ 7

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