Как ссылаться на универсальные классы и методы в 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 ответов:
/// <summary>Uses a <see cref="FancyClass{T}" /> instance.</summary>
кстати, он присутствовал в документации MSDN .Net Framework 2.0 и 3.0, но он исчез в версия 3.5
ни один из ответов, показанных до сих пор, не работает полностью для меня. Для ReSharper не преобразования см. В разделе помечайте в сочетание клавиш Ctrl + кликабельная ссылка (например,), если он не будет полностью разрешен.
если метод в 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
правила:
окружите список параметров универсального типа фигурными скобками
{}
вместо с<>
угловые скобки. Это избавляет вас от побега последнего как<
и>
- помнишь, документация комментарии в формате 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.
также будет правильно предоставлять подсказки, тогда как их версия отображает его с фигурными скобками.