Как ссылаться на универсальные классы и методы в 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.также будет правильно предоставлять подсказки, тогда как их версия отображает его с фигурными скобками.
