¿Cómo le dice a Resharper que un parámetro de método es una cadena que contiene una clase CSS?

118

[Habilitar intellisense en el atributo HTMLHelper para clases css]

Tengo este HTMLhelper:

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

Quiero que Resharper me proporcione IntelliSense para las clases CSS definidas en mi aplicación al pasar el valor del parámetro "cssClass".

Hay algunos atributos de anotación de código que reconoce Resharper, pero ninguno que parezca estar directamente relacionado con marcar un parámetro de método como clases CSS.

Lo más cercano que pude encontrar fue [HtmlAttributeValue (nombre de cadena)] . Traté de aplicar al parámetro cssClass así:

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

Pero eso no funciona. También sería increíble si Resharper reconociera la clase ingresada y dejara de molestarme sobre clases CSS desconocidas en las expresiones del selector de jQuery (que operan en el cuadro de texto generado por el asistente anterior).

Editar: Aquí hay una captura de pantalla del tipo de intellisense que funciona para el parámetro "htmlAttributes" de un método de acción. Esto se logra mediante el uso de la anotación [HtmlElementAttributes] en el parámetro.

Resharper html atributos intellisense

Quiero una anotación similar que me permita poner clases css en un parámetro de cadena y hacer que aparezca el mismo intellisense mostrando las clases css.

Raif Atef
fuente
10
Se abrió un problema en el rastreador de errores de ReSharper: youtrack.jetbrains.com/issue/RSRP-389238
Raif Atef
4
Buena pregunta, quiero saber la respuesta también.
Murtaza Munshi
2
@RaifAtef, ¿esto ya existe en ReSharper, podría agregar una captura de pantalla de lo que está hablando y solo para asegurarse de que no está hablando de stackoverflow.com/questions/529677/…
Seabizkit
2
@Seabizkit es similar al intellisense que obtienes cuando escribes "return View (" y obtienes intellisense con los nombres de las vistas, o cuando llamas "Html.Action (" y obtienes intellisense para el controlador y el nombre de la acción. Solo quiero que el resharper me muestre las clases de CSS cuando estoy ingresando el valor para el parámetro cssClass. EDITAR: No, mi pregunta es diferente de la tuya. La tuya es una cosa VS incorporada, la mía está estrictamente relacionada con el resharper.
Raif Atef
3
@RaifAtef, Ok ... el problema es que obviamente tengo ReSharper, pero no puedo ver de qué característica de ReSharper estás hablando ... Solo veo intellisense incorporado normal ... Estoy realmente interesado, ya que tal vez estoy Perdiendo algo de magia ReSharper, pero no puedo verlo. ¿Podría publicar una captura de pantalla de lo que debería estar viendo? Intenté con "Html.Action (" y "Html.MyCustomStuff" no veo ninguna diferencia entre los dos. Usando ReSharper 9.1.3 que es como uno de los más recientes.
Seabizkit

Respuestas:

3

Utilice [ValueProvider]

De las anotaciones de código que actualmente admite Resharper 10, el mejor candidato sería utilizar este atributo. Desde el enlace de arriba:

ValueProviderAttribute

Para un parámetro que se espera que sea uno del conjunto limitado de valores. Especifique los campos de qué tipo se deben usar como valores para este parámetro.

Desafortunadamente, no he descubierto cómo funciona. Tal vez tenga errores en mi Resharper versión 9.2.

Lo que he probado hasta ahora:

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

Incluso si lo hace funcionar, aún tendrá que completar la lista de Valores.

Y, por supuesto, aún puede desarrollar su anotación / extensión de código para Resharper.

¿Por qué no utilizar un objeto de tipo fuerte en lugar de una cadena?

A veces, en lugar de usar stringy int, podríamos usar clases con tipos más fuertes de nuestro propio diseño. Como parece que controlas tu código, puedes en lugar de usarlo stringcon un nombre css, puedes crear un nuevo tipo comoCssClass .

Solo necesita agregar como evento prediseñado una llamada a un generador que analiza cada CSS en el proyecto y crea dinámicamente una clase como esa:

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

y luego su muestra se verá así:

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);
    }
}
Fabuloso
fuente
Esto es interesante, pero no responde a la pregunta, ya que no tendrá todas las clases CSS utilizadas por la aplicación en todos sus archivos CSS.
Raif Atef