如何在xml文档中引用generics类和方法

在编写xml文档时,您可以使用<see cref="something">something</see> ,这当然是有效的。 但是,你如何引用一个类或genericstypes的方法?

 public class FancyClass<T> { public string FancyMethod<K>(T value) { return "something fancy"; } } 

如果我要在某处编写xml文档,我将如何引用这个奇特的类? 我怎么可以引用一个FancyClass<string> ? 那么这个方法呢?

例如,在一个不同的类中,我想让用户知道我将返回一个FancyClass<int>的实例。 我怎么能看到cref的东西呢?

引用方法:

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

顺便说一下,它是在.Net Framework 2.0和3.0的MSDN文档中出现的,但在3.5版本中却消失了

迄今为止所显示的答案都不适用于我。 ReSharper不会将see标签转换为Ctrl +可点击的链接(例如 图像在这里 ),除非它完全解决。

如果OP中的方法位于名为Test的名称空间中,则显示的方法的完整parsing链接将为:

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

正如你可能能够解决的那样,在typestypes参数的数量之前只应该有一个反引号,然后在方法types参数的数目之前两个反引号,然后参数是具有适当反引号数量的0索引参数。

所以我们可以看到,FancyClass有一个类types参数,FancyMethod有一个types参数,并且一个FancyClass参数types的对象将被传递给方法。

正如你可以更清楚地看到这个例子:

 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 parametersClass with 2 type parameters其具有method with 3 type parameters的方法,其中方法参数是ClassType1ClassType2MethodType1MethodType2MethodType3


作为补充说明,我没有在任何地方find这个logging,我也不是天才,编译器告诉我这一切。 所有你需要做的就是创build一个testing项目, 启用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) { } } } 

然后build立你的项目,输出的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> 

除了Lasse和TBC的回答:

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

也将提供正确的工具提示,而他们的版本与大括号呈现。

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> (例如作为参数types)的方法,但不能直接引用这种封闭的genericstypes。 第二个例子是围绕这个限制。 (这是在例如静态System.String.Concat(IEnumerable<string>)方法的MSDN refence页面上看到的)。 :

XML文档注释cref规则:

  • 使用大括号{}代替<>尖括号来包围genericstypes参数列表 。 这使您摆脱了后者&lt;&gt; – 记住,文档注释是XML的!

  • 如果包含前缀(例如T:表示types, M:表示types, M:表示方法, P:表示属性, F:表示字段),编译器将不会执行引用的任何validation,只是直接将cref属性值复制到文档XML输出。 因此,您必须使用适用于这些文件的特殊的“IDstring”语法 :始终使用完全限定的标识符,并使用反引号来引用genericstypes参数( `ntypes, ``n方法) 。

  • 如果您省略前缀则将使用常规语言命名规则:可以删除具有using语句的命名空间,并且可以使用语言的types关键字(如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); } } 
 /// <see cref="FancyClass&lt;T>.FancyMethod&lt;K>(T)"/> for more information. 
 /// Here we discuss the use of <typeparamref name="TYourExcellentType"/>. /// <typeparam name="TYourExcellentType">Your exellent documentation</typeparam>