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


118

[CSSクラスのHTMLHelper属性でIntelliSenseを有効にする]

私はこのHTMLhelperを持っています:

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

Resharperに、「cssClass」パラメーターの値を渡すときに、アプリケーションで定義されている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クラスを表示できるようにする同様の注釈が必要です。


10
ReSharperバグトラッカーで問題をオープン:youtrack.jetbrains.com/issue/RSRP-389238
Raif Atef

4
いい質問です。答えも知りたいです。
Murtaza Munshi 2015

2
@RaifAtefこれは、すでにあなたが話して何のスクリーンショットを追加することができますし、念のあなたが話していないにするために、ReSharperの中に存在しないstackoverflow.com/questions/529677/...
Seabizkit

2
@Seabizkitは、「return View(」を書き込んでビュー名でインテリセンスを取得したとき、または「Html.Action(」を呼び出してコントローラーとアクション名のインテリセンスを取得したときのインテリセンスに似ています。私はのCssClassパラメータの値を入力していたとき、私はちょうどReSharperのショーの私のCSSクラスを作りたいEDIT:いいえ、私の質問はあなたからdiffferentあるユアーズビルトインVSものです、鉱山、関連厳密にReSharperのです。。。
RAIF Atef

3
@RaifAtef、わかりました。問題は、ReSharper があることは明らかですが、 ReSharperのどの機能について話しているのかわかりません。通常の組み込みのインテリセンスが表示されるだけです...本当に興味があるので、 ReSharperの魔法を見逃してしまいましたが、私には見えません。私が見ているは​​ずのスクリーンショットを投稿してください。"Html.Action("と "Html.MyCustomStuff"を試してみたが、両者の間に違いは見られない。ReSharper9.1.3を使用すると、最新のものの1つである
Seabizkit

回答:


3

[ValueProvider]を使用します

現在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用のコード注釈/拡張機能を開発することもできます。

文字列の代わりに強い型付けのオブジェクトを使用しないのはなぜですか?

stringandの代わりにint、独自のデザインのより強い型付けのクラスを使用することもできます。コードを制御しているように見えるためstring、CSS名を使用する代わりに、のような新しいタイプを作成できます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);
    }
}

これは興味深いですが、すべてのCSSファイルでアプリが使用するすべてのCSSクラスがないため、質問には答えません。
Raif Atef 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.