Comment dire à Resharper qu'un paramètre de méthode est une chaîne contenant une classe CSS?

118

[Activer l'intellisense sur l'attribut HTMLHelper pour les classes css]

J'ai ce HTMLhelper:

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

Je souhaite que Resharper me donne IntelliSense pour les classes CSS définies dans mon application lors de la transmission de la valeur du paramètre "cssClass".

Il existe certains attributs d'annotation de code que Resharper reconnaît, mais aucun ne semble directement lié au marquage d'un paramètre de méthode comme étant des classes CSS.

Le plus proche que j'ai pu trouver était [HtmlAttributeValue (string name)] . J'ai essayé de m'appliquer au paramètre cssClass comme ceci:

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

Mais ça ne marche pas. Ce serait également super si Resharper reconnaissait la classe entrée et cessait de me déranger sur les classes CSS inconnues dans les expressions de sélecteur jQuery (qui fonctionnent sur la zone de texte générée par l'assistant ci-dessus).

Edit: Voici une capture d'écran du type d'intellisense qui fonctionne pour le paramètre "htmlAttributes" d'une méthode d'action. Pour ce faire, utilisez l'annotation [HtmlElementAttributes] sur le paramètre.

Resharper htmlAttributes Intellisense

Je veux une annotation similaire qui me permette de mettre des classes css dans un paramètre de chaîne et de faire apparaître le même intellisense montrant les classes css.

Raif Atef
la source
10
Ouverture d'un problème sur ReSharper bugtracker: youtrack.jetbrains.com/issue/RSRP-389238
Raif Atef
4
Belle question, je veux aussi connaître la réponse.
Murtaza Munshi
2
@RaifAtef est-ce que cela existe déjà dans ReSharper, pourriez-vous ajouter une capture d'écran de ce dont vous parlez et juste pour vous assurer que vous ne parlez pas de stackoverflow.com/questions/529677/…
Seabizkit
2
@Seabizkit il est similaire à l'intellisense que vous obtenez lorsque vous écrivez "return View (" et que vous obtenez intellisense avec les noms de vue, ou lorsque vous appelez "Html.Action (" et que vous obtenez intellisense pour le contrôleur et le nom de l'action. Je veux juste que le resharper me montre les classes CSS lorsque j'entre la valeur du paramètre cssClass. EDIT: Non, ma question est différente de la vôtre. La vôtre est une chose VS intégrée, la mienne est strictement liée au resharper.
Raif Atef
3
@RaifAtef, Ok .. le problème est que j'ai ReSharper évidemment mais je ne peux pas voir de quelle fonctionnalité de ReSharper vous parlez ... Je vois juste l'intellisense intégré normal ... Je suis vraiment intéressé car peut-être que je suis manquer un peu de magie ReSharper, mais je ne peux pas le voir. Pourriez-vous s'il vous plaît poster une capture d'écran de ce que je devrais voir. J'ai essayé avec "Html.Action (" et "Html.MyCustomStuff" ne vois aucune différence entre les deux. En utilisant ReSharper 9.1.3 qui est comme l'un des derniers.
Seabizkit

Réponses:

3

Utilisez [ValueProvider]

D'après les annotations de code actuellement prises en charge par Resharper 10, le meilleur candidat utiliserait cet attribut. À partir du lien ci-dessus:

ValueProviderAttribute

Pour un paramètre censé faire partie de l'ensemble limité de valeurs. Spécifiez les champs dont le type doit être utilisé comme valeurs pour ce paramètre.

Malheureusement, je n'ai pas compris comment cela fonctionne. C'est peut-être bogué dans ma version 9.2 de Resharper.

Ce que j'ai essayé jusqu'à présent:

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

Même si vous le faites fonctionner, vous devrez toujours remplir la liste des valeurs.

Et bien sûr, vous pouvez toujours développer votre annotation / extension de code pour Resharper.

Pourquoi ne pas utiliser un objet typé fort au lieu d'une chaîne?

Parfois, au lieu d'utiliser stringet int, nous pourrions utiliser des classes plus typées de notre propre conception. Puisqu'il semble que vous contrôlez votre code, vous pouvez au lieu d'utiliser stringavec un nom css dedans, vous pouvez créer un nouveau type comme CssClass.

Vous avez juste besoin d'ajouter comme événement prédéfini un appel à un générateur qui analyse chaque css du projet et crée dynamiquement une classe comme celle-ci:

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

puis votre échantillon ressemblera à ça:

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);
    }
}
Fabuleux
la source
C'est intéressant, mais ne répond pas à la question, car elle n'aura pas toutes les classes CSS utilisées par l'application dans tous ses fichiers CSS.
Raif Atef