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

7 174

7 ответов:

для ссылки на метод:

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

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

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

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

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

как вы можете быть в состоянии работать, там должен быть только один отступ перед количеством параметров типа класса, затем два backticks перед количеством параметров типа метода, то параметры являются 0-индексированный параметр с соответствующим количеством backticks.

таким образом, мы видим, что 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-документация включает ссылку в 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>

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 для статического System.String.Concat(IEnumerable<string>) метод). :

XML documentation comment cref правила:

  • окружите список параметров универсального типа фигурными скобками {} вместо с <> угловые скобки. Это избавляет вас от побега последнего как &lt; и &gt; - помнишь, документация комментарии в формате XML!

  • если вы включаете префикс (например,T: для типов, M: для методов, P: свойств F: для полей), компилятор не будет выполнять проверку ссылку, а просто скопировать cref значение атрибута прямо в вывод XML документации. По этой причине вам придется использовать специальный синтаксис"ID string" это относится к таким файлам: всегда используйте полную квалификацию идентификаторы и использовать обратные кавычки для ссылки на параметры универсального типа (`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. B. C:

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