Jak powiedzieć Resharperowi, że parametr metody jest łańcuchem zawierającym klasę CSS?

118

[Włącz funkcję Intellisense w atrybucie HTMLHelper dla klas css]

Mam tego HTMLhelpera:

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

Chcę, aby Resharper przekazał mi funkcję IntelliSense dla klas CSS zdefiniowanych w mojej aplikacji podczas przekazywania wartości parametru „cssClass”.

Istnieją pewne atrybuty adnotacji kodu, które Resharper rozpoznaje, ale żaden z nich nie wydaje się bezpośrednio związany z oznaczaniem parametru metody jako klas CSS.

Najbliższy, jaki udało mi się znaleźć, to [HtmlAttributeValue (nazwa ciągu)] . Próbowałem zastosować do parametru cssClass w ten sposób:

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

Ale to nie działa. Byłoby też super, gdyby Resharper rozpoznał wprowadzoną klasę i przestał mnie wkurzać o nieznane klasy CSS w wyrażeniach selektora jQuery (które działają na polu tekstowym wygenerowanym przez pomocnika powyżej).

Edycja: Oto zrzut ekranu przedstawiający rodzaj inteligencji, który działa dla parametru „htmlAttributes” metody akcji. Można to osiągnąć za pomocą adnotacji [HtmlElementAttributes] w parametrze.

Resharper htmlAttributes intellisense

Chcę mieć podobną adnotację, która pozwoli mi umieścić klasy css w parametrze ciągu i mieć ten sam intelisense, pokazujący klasy css.

Raif Atef
źródło
10
Otwarto problem w ReSharper bugtracker: youtrack.jetbrains.com/issue/RSRP-389238
Raif Atef
4
Ładne pytanie, ja też chcę poznać odpowiedź.
Murtaza Munshi
2
@RaifAtef, czy to już istnieje w ReSharper, czy możesz dodać zrzut ekranu tego, o czym mówisz, i tylko po to, aby upewnić się, że nie mówisz o stackoverflow.com/questions/529677/ ...
Seabizkit
2
@Seabizkit jest podobny do Intellisense, które otrzymujesz, pisząc „return View (”) i otrzymujesz Intellisense z nazwami widoków lub gdy wywołujesz „Html.Action (”) i otrzymujesz intelisense dla kontrolera i nazwy akcji. Chcę tylko, aby resharper pokazywał mi klasy CSS, kiedy wprowadzam wartość parametru cssClass. EDYCJA: Żadne moje pytanie nie różni się od twojego. Twoje jest wbudowane w VS, moje jest ściśle związane.
Raif Atef
3
@RaifAtef, Ok .. problem w tym, że mam ReSharper oczywiście, ale nie widzę, o jakiej funkcji ReSharper mówisz ... Widzę tylko normalny wbudowany intelisense ... Jestem szczerze zainteresowany, może jestem brakuje mi magii ReSharper, ale nie mogę tego zobaczyć. Czy mógłbyś zamieścić zrzut ekranu tego, co powinienem zobaczyć. Próbowałem z „Html.Action (” i „Html.MyCustomStuff” nie widzę żadnej różnicy między nimi). Używając ReSharper 9.1.3, który jest jak jeden z najnowszych.
Seabizkit

Odpowiedzi:

3

Użyj [ValueProvider]

Z adnotacji do kodu obecnie obsługiwanych przez Resharper 10, najlepszy kandydat użyłby tego atrybutu. Z powyższego linku:

ValueProviderAttribute

Dla parametru, który ma należeć do ograniczonego zestawu wartości. Określ pola, których typu mają być używane jako wartości tego parametru.

Niestety, nie zorientowałem się, jak to działa. Może jest wadliwy w mojej wersji Resharper 9.2.

Czego próbowałem do tej pory:

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

Nawet jeśli sprawisz, że to zadziała, nadal będziesz musiał wypełnić listę Wartości.

Oczywiście nadal możesz opracować adnotację / rozszerzenie kodu dla Resharper.

Dlaczego nie użyć silnie wpisanego obiektu zamiast łańcucha?

Czasami zamiast używać stringi int, moglibyśmy użyć własnych klas o silniejszym typie. Ponieważ wydaje się, że kontrolujesz swój kod, możesz zamiast używać stringw nim nazwy CSS, możesz utworzyć nowy typ, taki jak CssClass.

Wystarczy dodać jako wstępnie skompilowane zdarzenie wywołanie generatora, który analizuje każdy plik CSS w projekcie i dynamicznie tworzy taką klasę:

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

a wtedy twoja próbka będzie wyglądać tak:

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
źródło
Jest to interesujące, ale nie odpowiada na pytanie, ponieważ nie będzie zawierało wszystkich klas CSS używanych przez aplikację we wszystkich plikach CSS.
Raif Atef