Ответ 1
Чтобы ссылаться на метод:
/// <see cref="FancyClass{T}.FancyMethod{K}(T)"/> for more information.
При написании документации 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, он присутствовал в документации MSDN .NET Framework 2.0 и 3.0, но он исчез в версия 3.5
Ни один из ответов, показанных до сих пор, не работает полностью для меня. ReSharper не будет конвертировать тег see в ссылку Ctrl + clickable (например, ), если он полностью не разрешит.
Если метод в 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-документация включает ссылку в элементе 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>
В дополнение к ответам Лассе и 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.
также обеспечит всплывающие подсказки правильно, в то время как их версия отображает их с фигурными фигурными скобками.
"Как я могу ссылаться на
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>)
).
cref
: Оборудуйте список параметров типового типа с фигурными скобками {}
вместо угловых скобок <>
. Это избавляет вас от того, что вы избегаете последнего как <
и >
— помните, что комментарии к документации - XML!
Если вы добавляете префикс (например, T:
для типов, M:
для методов, P:
для свойств, F:
для полей), компилятор не будет выполните любую проверку ссылки, но просто скопируйте значение атрибута cref
прямо на выход XML документации. По этой причине вам придется использовать специальную "ID string", который применяется в таких файлах: всегда используйте полностью квалифицированные идентификаторы и используйте обратные ссылки для ссылки на параметры типового типа (`n
на типы, ``n
на методы).
Если вы опускаете префикс, применяются правила именования обычного языка: вы можете отбрасывать пространства имен, для которых существует оператор using
, и вы можете использовать ключевые слова типа языка, такие как int
вместо System.Int32
. Кроме того, компилятор проверяет правильность ссылки.
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);
}
}
/// <see cref="FancyClass<T>.FancyMethod<K>(T)"/> for more information.
/// Here we discuss the use of <typeparamref name="TYourExcellentType"/>.
/// <typeparam name="TYourExcellentType">Your exellent documentation</typeparam>