Saya ingin mengonversi string menjadi tipe generik seperti int
atau date
atau long
berdasarkan tipe kembalian generik.
Pada dasarnya fungsi seperti Parse<T>(String)
itu mengembalikan jenis item T
.
Misalnya jika int telah diteruskan fungsi harus dilakukan secara int.parse
internal.
c#
string
parsing
type-conversion
Karim
sumber
sumber
IConvertable
bukankah seharusnya Anda juga membatasiT
, yaituT ChangeType<T>(this object obj) where T : IConvertable
?obj
pastiIConvertible
, tapi tidak ada cara untuk menentukannya pada waktu kompilasi.Sepertinya saya terlambat untuk menjawab di utas ini. Tapi inilah implementasi saya:
Pada dasarnya, saya telah membuat metode Extention untuk kelas Object. Ini menangani semua tipe, yaitu nullable, class, dan struct.
public static T ConvertTo<T>(this object value) { T returnValue; if (value is T variable) returnValue = variable; else try { //Handling Nullable types i.e, int?, double?, bool? .. etc if (Nullable.GetUnderlyingType(typeof(T)) != null) { TypeConverter conv = TypeDescriptor.GetConverter(typeof(T)); returnValue = (T) conv.ConvertFrom(value); } else { returnValue = (T) Convert.ChangeType(value, typeof(T)); } } catch (Exception) { returnValue = default(T); } return returnValue; }
sumber
TypeDescriptor
tipe nullable danConvert.ChangeType
non-nullable? Seluruhtry
blok ini hanya dapat dikurangi menjadiTypeConverter
2 baris kode dan akan bekerja untuk keduanya, nullable dan non-nullable.System.Convert.ChangeType
tidak dikonversi ke tipe apa pun. Pikirkan hal-hal berikut:Konversi ini dimungkinkan dengan penerapan ChangeType ini .
sumber
versi lebih bersih dari jawaban Pranay
public static T ConvertTo<T>(this object value) { if (value is T variable) return variable; try { //Handling Nullable types i.e, int?, double?, bool? .. etc if (Nullable.GetUnderlyingType(typeof(T)) != null) { return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value); } return (T)Convert.ChangeType(value, typeof(T)); } catch (Exception) { return default(T); } }
sumber
Ada beberapa konvensi di .NET untuk mengonversi objek dari satu jenis ke jenis lainnya.
Tetapi metode ini jauh lebih lambat daripada biasanya
T.Parse(string)
, menyebabkan tinju dan melibatkan banyak alokasi setiap kali Anda ingin mengonversi satu nilai.Untuk ValueString , saya memilih untuk menemukan metode parsing statis yang sesuai dari tipe tersebut menggunakan refleksi, membangun ekspresi lambda yang memanggilnya dan menyimpan cache delegasi yang dikompilasi untuk digunakan di masa mendatang (Lihat jawaban ini sebagai contoh).
Itu juga mundur ke cara yang saya sebutkan di atas jika jenisnya tidak memiliki metode parsing yang sesuai (Lihat bagian kinerja di readme).
var v = new ValueString("15"); // struct var i = v.As<int>(); // Calls int.Parse.
sumber