118 votes

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

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

J'ai cet HTMLhelper :

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

Je veux que Resharper me donne de l'intellisense pour les classes CSS définies dans mon application lorsque je passe la valeur pour le paramètre "cssClass".

Il existe des attributs d'annotations de code que Resharper reconnaît, mais aucun qui semble directement lié à marquer 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 l'appliquer au paramètre cssClass de cette manière :

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

Mais cela ne fonctionne pas. Ce serait également génial si Resharper reconnaissait la classe saisie et arrêtait de me déranger à propos des classes CSS inconnues dans les expressions de sélecteur jQuery (qui opèrent sur le champ de texte généré par l'assistant ci-dessus).

Édition : Voici une capture d'écran du type d'intellisense qui fonctionne pour le paramètre "htmlAttributes" d'une méthode d'action. Cela est réalisé en utilisant 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 type chaîne et d'avoir le même intellisense qui affiche les classes CSS.

3voto

Fab Points 1773

Utiliser [ValueProvider]

Des annotations de code actuellement prises en charge par Resharper 10, le meilleur candidat serait d'utiliser cet attribut. Selon le lien ci-dessus :

ValueProviderAttribute

Pour un paramètre qui est censé être l'une des valeurs limitées. 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. Peut-être qu'il y a un bug dans ma version de Resharper 9.2.

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

namespace ValueProviderSample
{
    public static class MyValuesContainer
    {
        public static readonly string[] Values = { "un", "deux", "trois" };
    }

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

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

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

Pourquoi ne pas utiliser un objet fortement typé à la place d'une chaîne de caractères ?

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

Il vous suffit d'ajouter en tant qu'événement prédéfini un appel à un générateur qui analyse chaque classe css dans le 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");

    /// 
    /// Initialise une nouvelle instance de la classe .
    /// 
    private CssClass(string name)
    {
        Name = name;
    }
}

et ensuite votre exemple ressemblera à ceci :

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

    public void Usage()
    {
        MyTextBoxFor(html, expression, CssClass.In);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X