Verweisen auf generische Klassen und Methoden in der XML-Dokumentation


198

Beim Schreiben von XML-Dokumentation können Sie verwenden <see cref="something">something</see>, was natürlich funktioniert. Aber wie referenzieren Sie eine Klasse oder eine Methode mit generischen Typen?

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

Wenn ich irgendwo eine XML-Dokumentation schreiben würde, wie würde ich auf die schicke Klasse verweisen? Wie kann ich auf a verweisen FancyClass<string>? Was ist mit der Methode?

Zum Beispiel wollte ich in einer anderen Klasse den Benutzer wissen lassen, dass ich eine Instanz von zurückgeben werde FancyClass<int>. Wie könnte ich dafür ein See-Cref-Ding machen?

Antworten:


257

So verweisen Sie auf die Methode:

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

3
Danke für diese Antwort! Es fehlt tatsächlich auf der MSDN-Seite unter <see>: msdn.microsoft.com/en-us/library/acd0tfbe.aspx
joce

6
Ich glaube tatsächlich, dass es auch in VS2010-Tooltips funktioniert. Sie müssen die Anzahl der generischen Argumente angeben, z. B. "FancyClass 1{T}.FancyMethod1 {K} (T)"
Stephen Drew,

Ich bin mir nicht sicher, was du damit meinst. Ich musste diese nie hinzufügen, und es hat immer für mich funktioniert. Haben Sie ein bestimmtes Beispiel, bei dem es nicht funktioniert? Wenn ja, posten Sie es bitte irgendwo (oder geben Sie selbst eine Antwort.)
Lasse V. Karlsen

@Lasse, siehe Steves Antwort und Kommentare unten. Ihre Antwort enthält keine korrekten Intellisense-Tooltips.
Jakub Januszkiewicz

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

Übrigens war es in der MSDN-Dokumentation von .Net Framework 2.0 und 3.0 vorhanden , aber es verschwand in der Version 3.5


4
Was ist mit einer bestimmten Instanz von T? wie String? Vielleicht nicht möglich?
Svish

Was meinst du? Sie können eine bestimmte Version nicht deklarieren, daher können Sie auch nicht darauf verweisen.
Lasse V. Karlsen

Wenn eine Methode beispielsweise nur List <string> zurückgibt. Aber nicht wichtig :)
Svish

7
Ja, ich habe mich auch gefragt ... Resharper-Kringel beim Schreiben von FancyClass {string}, aber nicht beim Schreiben von FancyClass {String} ...
thinkbeforecoding

6
Der Grund für die obige Beobachtung von "Think Before Coding" ist, dass es mit den c # -Aliasen nicht funktioniert. Zum Beispiel müssen Sie Int32anstelle von verwenden int,Single anstelle von floatusw. verwenden (Geben Sie diese Informationen hier ein, falls jemand anderes darauf
stößt

27

TL; DR:

"Wie würde ich mich beziehen FancyClass<T>?"

   /// <see cref="FancyClass{T}"/>

"Was ist mit FancyClass<T>.FancyMethod<K>(T value)?"

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

"Wie kann ich auf a verweisen FancyClass<string>?"

   /// <see cref="SomeType.SomeMethod(FancyClass{string})"/>
   /// <see cref="FancyClass{T}"/> whose generic type argument is <see cref="string"/>

Während Sie auf eine Methode verweisen können , deren Signatur enthält FancyClass<string>(z. B. als Parametertyp), können Sie einen solchen geschlossenen generischen Typ nicht direkt referenzieren. Das zweite Beispiel umgeht diese Einschränkung. (Dies ist z. B. auf der MSDN-Referenzseite für die statische System.String.Concat(IEnumerable<string>)Methode zu sehen. ) ::

Kommentarregeln für XML-Dokumentation cref:

  • Umgeben Sie die generische Typparameterliste mit geschweiften Klammern {} anstatt mit <>spitzen Klammern. Dies erspart Ihnen die Flucht vor letzterem, da - &lt;und &gt;denken Sie daran, dass Dokumentationskommentare XML sind!

  • Wenn Sie ein Präfix einfügen (z. B.T: für Typen, M:Methoden, P:Eigenschaften,F: Felder), führt der Compiler keine Validierung der Referenz durch, sondern kopiert einfach den crefAttributwert direkt in die XML-Dokumentationsausgabe. Aus diesem Grund müssen Sie die spezielle "ID-Zeichenfolge" -Syntax verwenden , die in solchen Dateien gilt: Verwenden Sie immer vollqualifizierte Bezeichner und Backticks, um auf generische Typparameter zu verweisen ( `nauf Typen, ``nauf Methoden).

  • Wenn Sie das Präfix weglassen , gelten reguläre Sprache Benennungsregeln: Sie Namensräume für die Drop kann es eine ist usingAussage, und Sie können die Sprache der Art als solche Schlüsselwörter verwenden , intstatt System.Int32. Außerdem überprüft der Compiler die Referenz auf Richtigkeit.

Kommentar- crefSpickzettel zur XML-Dokumentation :

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);
    }
}

Wie beziehe ich mich nur auf das TTeil?
Nawfal

4
<typeparamref name="T"/>
Herausgefunden

21

Keine der bisher gezeigten Antworten funktioniert vollständig für mich. ReSharper konvertiert das see-Tag nicht in einen Ctrl+ klickbaren Link (zBild hier ), es sei denn, es wird vollständig aufgelöst.

Wenn sich die Methode im OP in einem aufgerufenen Namespace befindet Test, lautet der vollständig aufgelöste Link zu der gezeigten Methode:

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

Wie Sie vielleicht herausfinden können, sollte es nur einen Backtick vor der Anzahl der Klassentypparameter geben, dann zwei Backticks vor der Anzahl der Methodentypparameter, dann sind die Parameter der nullindizierte Parameter mit der entsprechenden Anzahl von Backticks.

Wir können also sehen, dass FancyClasses einen Klassentypparameter, FancyMethodeinen Typparameter und ein Objekt von gibtFancyClass Parametertyps an die Methode übergeben werden.

Wie Sie in diesem Beispiel deutlicher sehen können:

namespace Test
{
    public class FancyClass<A, B>
    {
        public void FancyMethod<C, D, E>(A a, B b, C c, D d, E e) { }
    }
}

Der Link wird:

M:Test.FancyClass`2.FancyMethod``3(`0,`1,``0,``1,``2)

Oder „Klasse mit zwei Typparametern , die ein Verfahren mit drei Typparametern aufweisen , wo die Verfahrensparameter sind ClassType1, ClassType2, MethodType1, MethodType2, MethodType3


Als zusätzliche Anmerkung fand ich dies nirgendwo dokumentiert und ich bin kein Genie, der Compiler hat mir das alles erzählt. Sie müssen lediglich ein Testprojekt erstellen, die XML-Dokumentation aktivieren , dann den Code einfügen, für den Sie einen Link erstellen möchten, und einen XML-Dokumentkommentar darauf setzen ( ///):

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

    public class Test
    {
        public static void Main(string[] args) { }
    }
}

Erstellen Sie dann Ihr Projekt, und die ausgegebene XML-Dokumentation enthält den Link im Element doc-> members-> memberunter dem Attribut name:

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

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

3
Dies sollte mehr positive Stimmen erhalten, insbesondere aufgrund des Tricks, die richtige Notation zu finden, ohne dass Sie durch Ausprobieren gehen müssen. Ein großes Lob mein Mann
Peter

10

Weiter von den Antworten von Lasse und TBC:

/// <see cref="T:FancyClass`1{T}"/> for more information.

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

wird auch QuickInfos korrekt bereitstellen, während ihre Version es mit den geschweiften Klammern rendert.


2
Mit <see cref = "System.Collections.Generic.List 1{T}"/>** causes a build-time warning: **XML comment on 'Blah' has syntactically incorrect cref attribute 'System.Collections.Generic.List1 <T> - möchten Sie näher erläutern, wie man dies verwenden soll?
Jakub Januszkiewicz

2
Hallo Jakub, das scheint ja nicht zu funktionieren. Die einzige Möglichkeit, Tooltips zum korrekten Funktionieren zu bringen, ist <see cref = "T: <fullTypeName>` 1 {T} "/>.
Stephen Drew

2
OK, ich habe es teilweise verstanden. Wenn die Methode selbst nicht generisch ist (wie in List <T> .Add ()), funktioniert dies: <see cref = "M: System.Collections.Generic.List`1 {T} .Add (T)" /> .
Jakub Januszkiewicz

1
Scheint nicht für mich zu arbeiten. Ich habe <see cref = "M: System.Collections.Generic.List`1 {T}" /> im Kommentar-Header für eine generische Erweiterungsmethode, die ich geschrieben habe (konvertiert eine ArrayList in eine Liste <T>), aber ReSharper kennzeichnet sie als Syntaxfehler, und IntelliSense zeigt ihn nur wörtlich an. VS 2010 / R # 6.1.37.86
Mike Loux

8
Aha! Ich konnte <see cref = "T: System.Collections.Generic.List`1" /> " zum Laufen bringen . Also hat die Verwendung von T: anstelle der geschweiften Klammern den Trick getan. Es erweitert den vollständigen Namespace, und der Trick funktioniert nicht, wenn Sie den Namespace nicht einschließen, so ist es nicht perfekt, aber es wird tun.
Mike Loux

5
/// Here we discuss the use of <typeparamref name="TYourExcellentType"/>.
/// <typeparam name="TYourExcellentType">Your exellent documentation</typeparam>

3
Beachten Sie, dass die anderen Antworten das Verweisen auf eine generische Klasse behandeln. Diese Antwort zeigt Ihnen, wie Sie den Typparameter selbst referenzieren, was zufällig das war, wonach ich gesucht habe.
jrh

1
/// <see cref="FancyClass&lt;T>.FancyMethod&lt;K>(T)"/> for more information.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.