Apakah ada cara untuk membuat metode ini generik sehingga saya dapat mengembalikan string, bool, int, atau double? Saat ini, ia mengembalikan sebuah string, tetapi jika ia dapat menemukan "true" atau "false" sebagai nilai konfigurasi, saya ingin mengembalikan bool misalnya.
public static string ConfigSetting(string settingName)
{
return ConfigurationManager.AppSettings[settingName];
}
c#
.net
generics
return-type
MacGyver
sumber
sumber
dynamic
kata kunci. Ada biaya kinerja untuk itu, tetapi untuk membaca file konfigurasi, biaya kinerja hampir pasti tidak signifikan.Jawaban:
Anda harus menjadikannya metode generik, seperti ini:
Tetapi penelepon harus menentukan jenis yang mereka harapkan. Anda kemudian dapat berpotensi menggunakan
Convert.ChangeType
, dengan asumsi bahwa semua jenis yang relevan didukung:Saya tidak sepenuhnya yakin bahwa semua ini adalah ide yang baik, ingatlah ...
sumber
ConfigSettingString
,ConfigSettingBool
, dll) memiliki keuntungan dari tubuh metode yang akan lebih pendek, lebih jelas, dan lebih baik fokus .Anda bisa menggunakan
Convert.ChangeType()
:sumber
Ada banyak cara untuk melakukan ini (dicantumkan berdasarkan prioritas, khusus untuk masalah OP)
Opsi 1: Pendekatan lurus - Buat beberapa fungsi untuk setiap jenis yang Anda harapkan daripada memiliki satu fungsi generik.
Opsi 2: Bila Anda tidak ingin menggunakan metode konversi mewah - Cast nilai ke objek dan kemudian ke tipe generik.
Catatan - Ini akan menimbulkan kesalahan jika gips tidak valid (kasing Anda). Saya tidak akan merekomendasikan melakukan ini jika Anda tidak yakin tentang jenis casting, lebih baik pergi untuk opsi 3.
Opsi 3: Generik dengan keamanan tipe - Buat fungsi generik untuk menangani konversi tipe.
Note - T adalah tipe yang diharapkan, perhatikan batasan mana di sini (tipe U harus IConvertible untuk menyelamatkan kita dari kesalahan)
sumber
U
? Tidak ada gunanya melakukannya, dan itu membuat metode ini lebih sulit untuk dipanggil. TerimaIConvertible
saja. Saya tidak berpikir itu layak termasuk opsi kedua untuk pertanyaan ini mengingat tidak menjawab pertanyaan yang diajukan. Anda mungkin juga harus mengganti nama metode pada opsi pertama ...Anda harus mengonversi jenis nilai pengembalian metode ke jenis Generik yang Anda berikan ke metode saat menelepon.
Anda perlu melewati tipe yang tipe kasta untuk nilai yang Anda kembalikan melalui metode itu.
Jika Anda ingin mengembalikan nilai yang bukan tipe kasta ke tipe generik yang Anda lewati, Anda mungkin harus mengubah kode atau memastikan Anda melewati tipe yang dapat di-kasta untuk nilai pengembalian metode. Jadi, pendekatan ini tidak direkomendasikan.
sumber
return (T)Convert.ChangeType(number, typeof(T));
adalah apa yang saya lewatkan - sorakanBuat fungsi dan bagikan parameter put sebagai tipe generik.
sumber
Silakan coba kode di bawah ini:
sumber
Saya melakukan ini di seluruh kode saya dan ingin cara untuk memasukkannya ke dalam metode. Saya ingin membagikan ini di sini karena saya tidak harus menggunakan Convert.ChangeType untuk nilai pengembalian saya. Ini mungkin bukan praktik terbaik tetapi berhasil bagi saya. Metode ini menggunakan larik tipe generik dan nilai untuk ditambahkan ke akhir larik. Array kemudian disalin dengan nilai pertama yang dilucuti dan nilai yang diambil ke dalam metode ditambahkan ke akhir array. Hal terakhir adalah saya mengembalikan array generik.
sumber