Bagaimana Anda memberi tahu Resharper bahwa parameter metode adalah string yang berisi kelas CSS?

118

[Aktifkan intellisense pada atribut HTMLHelper untuk kelas css]

Saya memiliki bantuan HTML ini:

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

Saya ingin Resharper memberi saya IntelliSense untuk kelas CSS yang ditentukan dalam aplikasi saya ketika memberikan nilai untuk parameter "cssClass".

Ada beberapa atribut anotasi kode yang dikenali Resharper, tetapi tidak ada yang tampaknya terkait langsung dengan menandai parameter metode sebagai kelas CSS.

Yang paling dekat yang bisa saya temukan adalah [HtmlAttributeValue (nama string)] . Saya mencoba menerapkan parameter cssClass seperti ini:

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

Tapi itu tidak berhasil. Ini juga akan sangat luar biasa jika Resharper akan mengenali kelas yang dimasukkan dan berhenti mengganggu saya tentang kelas CSS yang tidak diketahui dalam ekspresi pemilih jQuery (yang beroperasi pada kotak teks yang dihasilkan oleh helper di atas).

Edit: Berikut adalah tangkapan layar dari jenis intellisense yang bekerja untuk parameter "htmlAttributes" dari metode tindakan. Ini dilakukan dengan menggunakan anotasi [HtmlElementAttributes] pada parameter.

Resharper htmlAttributes intellisense

Saya ingin penjelasan serupa yang memungkinkan saya menempatkan kelas css dalam parameter string dan memiliki intellisense yang sama muncul menampilkan kelas css.

Raif Atef
sumber
10
Membuka masalah di ReSharper bugtracker: youtrack.jetbrains.com/issue/RSRP-389238
Raif Atef
4
Pertanyaan bagus, saya ingin tahu jawabannya juga.
Murtaza Munshi
2
@RaifAtef apakah ini sudah ada di ReSharper, dapatkah Anda menambahkan tangkapan layar dari apa yang Anda bicarakan dan hanya untuk memastikan Anda tidak berbicara tentang stackoverflow.com/questions/529677/…
Seabizkit
2
@Seabizkit ini mirip dengan intellisense yang Anda dapatkan saat Anda menulis "return View (" dan Anda mendapatkan intellisense dengan nama tampilan, atau saat Anda memanggil "Html.Action (" dan Anda mendapatkan kecerdasan untuk controller dan nama tindakan. Saya hanya ingin membuat resharper menunjukkan kelas CSS ketika saya memasukkan nilai untuk parameter cssClass EDIT: Tidak, pertanyaan saya berbeda dari pertanyaan Anda. Milik Anda adalah built-in VS hal, milik saya sangat terkait resharper.
Raif Atef
3
@RaifAtef, Ok .. masalahnya, saya jelas memiliki ReSharper tetapi tidak dapat melihat fitur ReSharper apa yang Anda bicarakan ... Saya hanya melihat intellisense bawaan yang normal ... Saya benar-benar tertarik karena mungkin saya melewatkan beberapa keajaiban ReSharper, tetapi saya tidak bisa melihatnya. Bisakah Anda memposting tangkapan layar dari apa yang seharusnya saya lihat. Saya mencoba dengan "Html.Action (" dan "Html.MyCustomStuff" tidak melihat perbedaan apa pun di antara keduanya. Menggunakan ReSharper 9.1.3 yang seperti salah satu yang terbaru.
Seabizkit

Jawaban:

3

Gunakan [ValueProvider]

Dari Anotasi Kode yang saat ini didukung oleh Resharper 10, kandidat terbaik akan menggunakan atribut ini. Dari tautan di atas:

ValueProviderAttribute

Untuk parameter yang diharapkan menjadi salah satu dari kumpulan nilai terbatas. Tentukan bidang yang jenisnya harus digunakan sebagai nilai untuk parameter ini.

Sayangnya, saya belum mengetahui cara kerjanya. Mungkin ada bug di Resharper versi 9.2 saya.

Apa yang saya coba sejauh ini:

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

Meskipun berhasil, Anda masih harus mengisi daftar Nilai.

Dan tentu saja, Anda masih dapat mengembangkan penjelasan / ekstensi kode Anda untuk Resharper.

Mengapa tidak menggunakan objek yang diketik kuat dan bukan string?

Terkadang alih-alih menggunakan stringdan int, kita bisa menggunakan kelas yang diketik lebih kuat dari desain kita sendiri. Karena tampaknya Anda mengontrol kode Anda, alih-alih menggunakan stringdengan nama css di dalamnya, Anda dapat membuat tipe baru seperti CssClass.

Anda hanya perlu menambahkan sebagai acara prebuilt panggilan ke generator yang mengurai setiap css dalam proyek dan secara dinamis membuat kelas seperti itu:

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

dan sampel Anda akan terlihat seperti itu:

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);
    }
}
Luar biasa
sumber
Ini menarik, tetapi tidak menjawab pertanyaannya, karena tidak semua kelas CSS digunakan oleh aplikasi di semua file CSS-nya.
Raif Atef