如何告诉 Resharper 方法参数是包含 CSS 类的字符串?

[为 css 类启用 HTMLHelper 属性上的智能感知]

我有这个 HTMLhelper:

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

当传递“ cssClass”参数的值时,我希望 Resharper 为我的应用程序中定义的 CSS 类提供 IntelliSense。

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

The closest I could find was [ HtmlAttributeValue (字符串名称)]. 我尝试像下面这样应用 cssClass 参数:

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

但这不管用。如果 Resharper 能够识别输入的类,并停止在 jQuery 选择器表达式(在上面的 helper 生成的文本框上操作)中纠缠我关于未知 CSS 类的问题,那将是非常棒的。

编辑: 下面是为 action 方法的“ htmlAttritribute”参数工作的智能感知类型的屏幕截图。这是通过对参数使用[ HtmlElementAttritribute ]注释实现的。

Resharper htmlAttributes intellisense

我想要一个类似的注释,让我把 css 类放在一个字符串参数,并有相同的智能感觉显示 css 类。

2705 次浏览

Use [ValueProvider]

From the 代码注释 currently supported by Resharper 10, the best candidate would to use this attribute. From the above link:

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

Even if you make it work, you'll still have to populate the Values list.

当然,您仍然可以为 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);
}
}