Как сообщить Resharper, что параметр метода - это строка, содержащая класс CSS?

118

[Включить intellisense в атрибуте HTMLHelper для классов css]

У меня есть HTMLhelper:

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

Я хочу, чтобы Resharper предоставил мне классы IntelliSense для CSS, определенные в моем приложении, при передаче значения для параметра cssClass.

Resharper распознает некоторые атрибуты аннотации кода, но ни один из них не имеет прямого отношения к маркировке параметра метода как класса CSS.

Ближайшее, что я смог найти, было [HtmlAttributeValue (имя строки)] . Я пробовал применить к параметру cssClass вот так:

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

Но это не работает. Было бы также замечательно, если бы Resharper распознал введенный класс и перестал беспокоить меня о неизвестных классах CSS в выражениях селектора jQuery (которые работают с текстовым полем, созданным указанным выше помощником).

Изменить: вот скриншот типа intellisense, который работает с параметром «htmlAttributes» метода действия. Это достигается с помощью аннотации [HtmlElementAttributes] к параметру.

Resharper htmlAttributes intellisense

Мне нужна аналогичная аннотация, которая позволяет мне помещать классы css в строковый параметр и иметь тот же самый intellisense, отображающий классы css.

Раиф Атеф
источник
10
Открыта проблема в багтрекере ReSharper: youtrack.jetbrains.com/issue/RSRP-389238
Раиф Атеф
4
Хороший вопрос, я тоже хочу знать ответ.
Муртаза Мунши
2
@RaifAtef это уже существует в ReSharper, не могли бы вы добавить скриншот того, о чем вы говорите, и просто чтобы убедиться, что вы не говорите о stackoverflow.com/questions/529677/…
Seabizkit
2
@Seabizkit похож на intellisense, который вы получаете, когда пишете "return View (" и получаете intellisense с именами представлений, или когда вы вызываете "Html.Action (", и вы получаете intellisense для имени контроллера и действия. Я просто хочу, чтобы resharper показывал мне классы CSS, когда я ввожу значение параметра cssClass. РЕДАКТИРОВАТЬ: Нет, мой вопрос не отличается от вашего. Ваш вопрос встроен в VS, мой строго связан с resharper.
Раиф Атеф
3
@RaifAtef, хорошо ... проблема в том, что у меня есть ReSharper, но я не вижу, о какой функции ReSharper вы говорите ... Я просто вижу нормальный встроенный intellisense ... Мне искренне интересно, может я упускаю некоторую магию ReSharper, но я не вижу ее. Не могли бы вы опубликовать скриншот того, что я должен видеть. Я пробовал с «Html.Action (» и «Html.MyCustomStuff», не вижу никакой разницы между ними. Используя ReSharper 9.1.3, который похож на один из последних.
Seabizkit

Ответы:

3

Используйте [ValueProvider]

Из аннотаций кода, которые в настоящее время поддерживает Resharper 10, лучшим кандидатом было бы использовать этот атрибут. По ссылке выше:

ValueProviderAttribute

Для параметра, который, как ожидается, будет одним из ограниченного набора значений. Укажите поля какого типа следует использовать в качестве значений для этого параметра.

К сожалению, я не разобрался, как это работает. Может он глючит в моем Resharper версии 9.2.

Что я пробовал до сих пор:

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

Даже если вы заставите его работать, вам все равно придется заполнить список значений.

И, конечно же, вы все еще можете разработать аннотацию / расширение кода для Resharper.

Почему бы не использовать объект со строгой типизацией вместо строки?

Иногда вместо использования stringи intмы могли бы использовать классы с более строгой типизацией нашей собственной разработки. Поскольку кажется, что вы контролируете свой код, вы можете вместо использования stringс именем css в нем создать новый тип, напримерCssClass .

Вам просто нужно добавить в качестве предварительно созданного события вызов генератора, который анализирует каждый css в проекте и динамически создает такой класс:

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

и тогда ваш образец будет выглядеть так:

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);
    }
}
потрясающий
источник
Это интересно, но не отвечает на вопрос, поскольку в нем не будут все классы CSS, используемые приложением во всех его файлах CSS.
Раиф Атеф