[c#] Resharper에게 메소드 매개 변수가 CSS 클래스를 포함하는 문자열임을 어떻게 알립니 까?

[css 클래스의 HTMLHelper 속성에 intellisense 사용]

이 HTMLhelper가 있습니다.

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

“cssClass”매개 변수의 값을 전달할 때 Resharper가 내 애플리케이션에 정의 된 CSS 클래스에 IntelliSense를 제공하기를 원합니다.

Resharper가 인식하는 몇 가지 코드 주석 속성이 있지만 메서드 매개 변수를 CSS 클래스로 표시하는 것과 직접적으로 관련된 것은 없습니다.

내가 찾을 수있는 가장 가까운 것은 [HtmlAttributeValue (string name)] 입니다. 다음과 같이 cssClass 매개 변수에 적용하려고했습니다.

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

그러나 그것은 작동하지 않습니다. Resharper가 입력 된 클래스를 인식하고 jQuery 선택기 표현식 (위의 도우미가 생성 한 텍스트 상자에서 작동하는)의 알 수없는 CSS 클래스에 대해 저를 괴롭히는 것을 중지한다면 정말 멋질 것입니다.

편집 :
다음은 작업 메서드의 “htmlAttributes”매개 변수에 대해 작동하는 일종의 인텔리 센스 스크린 샷입니다. 이는 매개 변수에 [HtmlElementAttributes] 주석을 사용하여 수행됩니다.

Resharper htmlAttributes intellisense

CSS 클래스를 문자열 매개 변수에 넣고 CSS 클래스를 표시하는 동일한 인텔리전스가 나타나는 유사한 주석을 원합니다.



답변

[ValueProvider] 사용

Resharper 10에서 현재 지원 하는 코드 주석 중에서 가장 적합한 후보는이 속성을 사용하는 것입니다. 위 링크에서 :

ValueProviderAttribute

제한된 값 세트 중 하나가 될 것으로 예상되는 매개 변수의 경우. 이 매개 변수의 값으로 사용되어야하는 유형의 필드를 지정하십시오.

불행히도 나는 그것이 어떻게 작동하는지 이해하지 못했습니다. 내 Resharper 버전 9.2에서는 버그가있을 수 있습니다.

지금까지 시도한 것 :

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, 우리는 우리 자신의 디자인의 강력한 형식의 클래스를 사용할 수 있습니다. 코드를 제어하는 ​​것처럼 보이기 때문에 stringCSS 이름 을 사용 하는 대신 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);
    }
}


답변