web-dev-qa-db-ja.com

メソッドパラメータがCSSクラスを含む文字列であることをResharperにどのように伝えますか?

[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クラスとしてマークすることに直接関連しているように見えるものはありません。

私が見つけた最も近いものは[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クラスを表示できる同様のアノテーションが必要です。

118
Raif Atef

[ValueProvider]を使用する

Code Annotations 現在Resharper 10でサポートされていることから、最適な候補はこの属性を使用することです。上記のリンクから:

ValueProviderAttribute

制限された値のセットの1つであると予想されるパラメーターの場合。このパラメーターの値として使用するタイプのフィールドを指定します。

残念ながら、私はそれがどのように機能するのか理解していません。たぶん、私の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を使用する代わりに、独自の設計のより強力な型クラスを使用できる場合があります。コードを制御しているように見えるので、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);
    }
}
3
Fab