c# - 你如何告诉Resharper一个方法参数是一个包含CSS类的字符串?



asp.net-mvc intellisense (1)

[为CSS类的HTMLHelper属性启用intellisense]

我有这个HTMLhelper:

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

我希望Resharper在为我的应用程序传递“cssClass”参数的值时为我的IntelliSense for CSS类定义。

有一些Resharper可以识别的代码注释属性,但没有一个与将方法参数标记为CSS类直接相关。

我能找到的最接近的是[HtmlAttributeValue(字符串名称)] 。 我试图应用到这样的cssClass参数:

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

但那不行。 如果Resharper能识别输入的类并停止在jQuery选择器表达式中对未知的CSS类进行操作(对上面的帮助程序生成的文本框进行操作),那也会非常棒。

编辑:下面是适用于操作方法的“htmlAttributes”参数的智能感知类型的屏幕截图。 这是通过在参数上使用[HtmlElementAttributes]注释来完成的。

我想要一个类似的注释,它可以让我把css类放在一个字符串参数中,并且有相同的intellisense显示css类。


使用[ValueProvider]

从Resharper 10当前支持的代码注释中 ,最好的候选者会使用这个属性。 从上面的链接:

ValueProviderAttribute

对于预期为有限的一组值的参数。 指定哪些类型应该用作此参数的值的字段。

不幸的是,我还没有弄清楚它是如何工作的。 也许这是我的Resharper 9.2版中的bug。

我到目前为止所尝试的是:

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开发代码注释/扩展。

为什么不使用强类型对象而不是字符串?

有时候不用stringint ,我们可以使用我们自己设计的更强类型的类。 由于您似乎控制了您的代码,因此您可以不使用带有css名称的string ,而是创建一个类似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);
    }
}




html-helper