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

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

如果我要在某个地方编写xml文档,我该如何引用这个奇特的类呢?我怎么能引用一个幻想类<字符串>?方法呢?

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


当前回答

到目前为止,没有一个答案完全适合我。ReSharper不会将see标签转换为Ctrl+可点击的链接(例如),除非它完全解析。

如果OP中的方法在名为Test的命名空间中,则显示的方法的完全解析链接将是:

<参见 cref=“M:Test.FancyClass'1.FancyMethod''1('0)”/>

正如您可能能够计算出的那样,在类类型参数的数量之前应该只有一个反勾号,然后在方法类型参数的数量之前应该只有两个反勾号,然后这些参数是具有适当反勾号数量的零索引参数。

因此,我们可以看到FancyClass有一个类类型参数,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)

或者“有两个类型参数的类,它有一个有三个类型参数的方法,其中方法参数是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->成员元素中的链接:

<?xml version="1.0"?>
<doc>
    <assembly>
        <name>Test</name>
    </assembly>
    <members>
        <member name="M:Test.FancyClass`1.FancyMethod``1(`0)">

        </member>
    </members>
</doc>

其他回答

/// <see cref="FancyClass&lt;T>.FancyMethod&lt;K>(T)"/> for more information.

从Lasse和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.

也会正确地提供工具提示,而他们的版本用花括号呈现。

引用方法:

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

到目前为止,没有一个答案完全适合我。ReSharper不会将see标签转换为Ctrl+可点击的链接(例如),除非它完全解析。

如果OP中的方法在名为Test的命名空间中,则显示的方法的完全解析链接将是:

<参见 cref=“M:Test.FancyClass'1.FancyMethod''1('0)”/>

正如您可能能够计算出的那样,在类类型参数的数量之前应该只有一个反勾号,然后在方法类型参数的数量之前应该只有两个反勾号,然后这些参数是具有适当反勾号数量的零索引参数。

因此,我们可以看到FancyClass有一个类类型参数,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)

或者“有两个类型参数的类,它有一个有三个类型参数的方法,其中方法参数是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->成员元素中的链接:

<?xml version="1.0"?>
<doc>
    <assembly>
        <name>Test</name>
    </assembly>
    <members>
        <member name="M:Test.FancyClass`1.FancyMethod``1(`0)">

        </member>
    </members>
</doc>
/// <summary>Uses a <see cref="FancyClass{T}" /> instance.</summary>

顺便说一句,它出现在。net Framework 2.0和3.0的MSDN文档中,但在3.5版本中消失了