Wie können Sie Resharper mitteilen, dass ein Methodenparameter eine Zeichenfolge ist, die eine CSS-Klasse enthält?

118

[Aktivieren Sie das Intellisense-Attribut HTMLHelper für CSS-Klassen]

Ich habe diesen HTMLhelper:

public IHtmlString MyTextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TProperty>> propertyExpression, 
    string cssClass)
{
    // ...
}

Ich möchte, dass Resharper mir IntelliSense für CSS-Klassen gibt, die in meiner Anwendung definiert sind, wenn der Wert für den Parameter "cssClass" übergeben wird.

Es gibt einige Code-Annotation-Attribute, die Resharper erkennt, aber keine, die in direktem Zusammenhang mit dem Markieren eines Methodenparameters als CSS-Klassen stehen.

Das nächste, das ich finden konnte, war [HtmlAttributeValue (Stringname)] . Ich habe versucht, den Parameter cssClass folgendermaßen anzuwenden:

public IHtmlString MyTextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TProperty>> propertyExpression, 
    [HtmlAttributeValue("class")] string cssClass)
{
    // ...
}

Das geht aber nicht Es wäre auch super toll, wenn Resharper die eingegebene Klasse erkennen und mich nicht mehr über unbekannte CSS-Klassen in jQuery-Selektorausdrücken nerven würde (die mit dem vom obigen Helfer generierten Textfeld arbeiten).

Bearbeiten: Hier ist ein Screenshot der Art von Intellisense, die für den Parameter "htmlAttributes" einer Aktionsmethode funktioniert. Dies wird mithilfe der Annotation [HtmlElementAttributes] für den Parameter erreicht.

Resharper htmlAttributes Intellisense

Ich möchte eine ähnliche Annotation, mit der ich CSS-Klassen in einen Zeichenfolgenparameter einfügen kann und dieselbe Intellisense mit CSS-Klassen angezeigt wird.

Raif Atef
quelle
10
Öffnete
Raif Atef
4
Schöne Frage, ich möchte auch die Antwort wissen.
Murtaza Munshi
2
@ RaifAtef existiert dies bereits in ReSharper, könnten Sie einen Screenshot von dem hinzufügen, worüber Sie sprechen, und nur um sicherzustellen, dass Sie nicht über stackoverflow.com/questions/529677/…
Seabizkit
2
@Seabizkit ähnelt dem Intellisense, das Sie erhalten, wenn Sie "return View (" schreiben und Intellisense mit den Ansichtsnamen erhalten, oder wenn Sie "Html.Action (") aufrufen und Intellisense für den Controller- und Aktionsnamen erhalten. Ich möchte nur, dass Resharper mir CSS-Klassen anzeigt, wenn ich den Wert für den Parameter cssClass eingebe. BEARBEITEN: Nein, meine Frage unterscheidet sich von Ihrer. Ihre ist eine integrierte VS-Sache, meine ist ausschließlich mit Resharper verbunden.
Raif Atef
3
@RaifAtef, Ok .. das Problem ist, ich habe offensichtlich ReSharper , kann aber nicht sehen, über welche Funktion von ReSharper Sie sprechen ... Ich sehe nur normales eingebautes Intellisense ... Ich bin wirklich interessiert, wie ich vielleicht bin Ich habe etwas ReSharper-Magie verpasst, aber ich kann es nicht sehen. Könnten Sie bitte einen Screenshot von dem posten, was ich sehen sollte. Ich habe versucht, mit "Html.Action (" und "Html.MyCustomStuff" keinen Unterschied zwischen den beiden zu sehen. Mit ReSharper 9.1.3, das wie eines der neuesten ist.
Seabizkit

Antworten:

3

Verwenden Sie [ValueProvider]

Aus den derzeit von Resharper 10 unterstützten Code Annotations würde der beste Kandidat dieses Attribut verwenden. Über den obigen Link:

ValueProviderAttribute

Für einen Parameter, von dem erwartet wird, dass er zu den begrenzten Werten gehört. Geben Sie Felder an, deren Typ als Werte für diesen Parameter verwendet werden soll.

Leider habe ich nicht herausgefunden, wie es funktioniert. Vielleicht ist es in meiner Resharper-Version 9.2 fehlerhaft.

Was ich bisher versucht habe:

namespace ValueProviderSample
{
    public static class MyValuesContainer
    {
        public static readonly string[] Values = { "one", "two", "three" };
    }

    public class MyMethodContainer
    {
        public string MyMethod([ValueProvider("ValueProviderSample.MyValuesContainer.Values")]
                               string parameter)
        {
            return string.Empty;
        }
    }
}

Selbst wenn Sie es zum Laufen bringen, müssen Sie die Werteliste noch füllen.

Und natürlich können Sie Ihre Code-Annotation / -Erweiterung für Resharper weiterentwickeln.

Warum nicht ein stark typisiertes Objekt anstelle eines Strings verwenden?

Manchmal könnten wir anstelle von stringund intKlassen mit stärkerem Typ unseres eigenen Designs verwenden. Da Sie anscheinend Ihren Code steuern, können Sie anstelle stringeines CSS-Namens einen neuen Typ wie erstellen CssClass.

Sie müssen lediglich als vorgefertigtes Ereignis einen Aufruf an einen Generator hinzufügen, der jedes CSS im Projekt analysiert und dynamisch eine Klasse wie diese erstellt:

public class CssClass
{
    public string Name { get; private set; }

    public static CssClass In = new CssClass("in");

    /// <summary>
    /// Initialise une nouvelle instance de la classe <see cref="T:System.Object"/>.
    /// </summary>
    private CssClass(string name)
    {
        Name = name;
    }
}

und dann sieht Ihre Probe so aus:

public class MySample
{
    public IHtmlString MyTextBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> html,
        Expression<Func<TModel, TProperty>> propertyExpression,
        CssClass cssClass)
    {
        // ...
    }

    public void Usage()
    {
        MyTextBoxFor(html, expression, CssClass.In);
    }
}
Fab
quelle
Dies ist interessant, beantwortet jedoch nicht die Frage, da nicht alle von der App verwendeten CSS-Klassen in allen CSS-Dateien enthalten sind.
Raif Atef