Как вы скажете Resharper, что параметр метода является строкой, содержащей класс CSS?

[Включить 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 (которые работают с текстовым полем, созданным помощником выше).

Edit: Здесь показан снимок экрана типа intellisense, который работает для параметра "htmlAttributes" метода действия. Это достигается с помощью аннотации [HtmlElementAttributes] по параметру.

Resharper htmlAttributes intellisense

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

Ответ 1

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

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

ValueProviderAttribute

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

К сожалению, я не понял, как это работает. Возможно, это ошибка в моей версии 9.2 Resharper.

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

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