Saya berharap untuk melakukan sesuatu seperti ini, tetapi tampaknya ilegal di C #:
public Collection MethodThatFetchesSomething<T>()
where T : SomeBaseClass
{
return T.StaticMethodOnSomeBaseClassThatReturnsCollection();
}
Saya mendapatkan kesalahan waktu kompilasi: "'T' adalah 'parameter tipe', yang tidak valid dalam konteks yang diberikan."
Diberikan parameter tipe generik, bagaimana saya dapat memanggil metode statis pada kelas generik? Metode statis harus tersedia, mengingat batasannya.
Jawaban:
Dalam hal ini Anda hanya perlu memanggil metode statis pada tipe yang dibatasi secara langsung. C # (dan CLR) tidak mendukung metode statis virtual. Begitu:
... tidak bisa berbeda dengan:
Melalui parameter tipe generik adalah tipuan yang tidak dibutuhkan dan karenanya tidak didukung.
sumber
return SomeBaseClass.StaticMethodOnSomeBaseClassThatReturnsCollection();
berhasil? Jika demikian, Anda mungkin ingin menambahkannya ke jawaban Anda. Terima kasih. Itu berhasil untuk saya. Dalam kasus saya, kelas saya memiliki tipe param jadi saya lakukanreturn SomeBaseClass<T>.StaticMethodOnSomeBaseClassThatReturnsCollection();
dan itu berhasil.Untuk menguraikan jawaban sebelumnya, menurut saya refleksi lebih dekat dengan apa yang Anda inginkan di sini. Saya dapat memberikan 1001 alasan mengapa Anda harus atau tidak harus melakukan sesuatu, saya akan menjawab pertanyaan Anda seperti yang ditanyakan. Saya pikir Anda harus memanggil metode GetMethod pada jenis parameter generik dan pergi dari sana. Misalnya, untuk suatu fungsi:
Di mana T adalah kelas apa pun yang memiliki metode statis fetchAll ().
Ya, saya sadar ini sangat lambat dan mungkin macet jika someParent tidak memaksa semua kelas turunannya untuk mengimplementasikan fetchAll tetapi menjawab pertanyaan seperti yang ditanyakan.
sumber
Satu-satunya cara untuk memanggil metode semacam itu adalah melalui refleksi, Namun, sepertinya dimungkinkan untuk menggabungkan fungsionalitas itu dalam antarmuka dan menggunakan pola IoC / pabrik / dll berbasis instans.
sumber
Sepertinya Anda mencoba menggunakan obat generik untuk mengatasi fakta bahwa tidak ada "metode statis virtual" di C #.
Sayangnya, itu tidak akan berhasil.
sumber
Sampai sekarang, Anda tidak bisa. Anda memerlukan cara untuk memberi tahu kompilator bahwa T memiliki metode itu, dan saat ini, tidak ada cara untuk melakukannya. (Banyak yang mendorong Microsoft untuk memperluas apa yang dapat ditentukan dalam batasan umum, jadi mungkin ini akan memungkinkan di masa mendatang).
sumber
Di sini, saya memposting contoh yang berhasil, itu solusinya
sumber
public T : SomeBaseClass
maksudnyaSaya hanya ingin menunjukkan bahwa terkadang delegasi memecahkan masalah ini, tergantung pada konteksnya.
Jika Anda perlu memanggil metode statis sebagai semacam pabrik atau metode inisialisasi, Anda dapat mendeklarasikan delegasi dan meneruskan metode statis ke pabrik generik yang relevan atau apa pun yang membutuhkan "kelas generik dengan metode statis ini".
Sebagai contoh:
Sayangnya Anda tidak dapat memaksakan bahwa kelas memiliki metode yang tepat, tetapi Anda setidaknya dapat mengkompilasi-waktu-menegakkan bahwa metode pabrik yang dihasilkan memiliki semua yang diharapkan (yaitu metode inisialisasi dengan tanda tangan yang tepat). Ini lebih baik daripada pengecualian refleksi waktu proses.
Pendekatan ini juga memiliki beberapa keuntungan, yaitu Anda dapat menggunakan kembali metode init, menjadikannya metode instance, dll.
sumber
Anda harus dapat melakukan ini dengan menggunakan refleksi, seperti yang dijelaskan di siniKarena tautan mati, saya menemukan detail yang relevan di mesin wayback:
sumber