Saya memiliki kelas yang ingin saya gunakan untuk menyimpan "properti" untuk kelas lain. Properti ini hanya memiliki nama dan nilai. Idealnya, yang saya inginkan adalah dapat menambahkan properti yang diketik , sehingga "nilai" yang dikembalikan selalu dari tipe yang saya inginkan.
Jenisnya harus selalu primitif. Kelas ini subkelas kelas abstrak yang pada dasarnya menyimpan nama dan nilai sebagai string. Idenya adalah bahwa subclass ini akan menambahkan beberapa jenis-keamanan ke kelas dasar (serta menyelamatkan saya pada beberapa konversi).
Jadi, saya telah membuat kelas yang kira-kira:
public class TypedProperty<DataType> : Property
{
public DataType TypedValue
{
get { // Having problems here! }
set { base.Value = value.ToString();}
}
}
Jadi pertanyaannya adalah:
Apakah ada cara "generik" untuk mengkonversi dari string kembali ke primitif?
Sepertinya saya tidak dapat menemukan antarmuka umum yang menautkan konversi di seluruh papan (sesuatu seperti ITryParsable pasti ideal!).
sumber
Jawaban:
Saya tidak yakin apakah saya memahami niat Anda dengan benar, tetapi mari kita lihat apakah ini membantu.
sumber
Convert.ChangeType
ini bukan solusi yang sangat universal dan dapat diperluas, ini bekerja untuk sebagian besar tipe dasar. jika sesuatu yang lebih baik diperlukan, tidak ada masalah untuk membungkus metode ini menjadi sesuatu yang lebih besar seperti yang disarankan Tim atau menggunakan metode konversi yang berbeda sekaligus.Metode lubos hasko gagal untuk nullables. Metode di bawah ini akan berfungsi untuk nullables. Tapi aku tidak memunculkannya. Saya menemukannya melalui Google: http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx Kredit untuk "Tuna Toksoz"
Penggunaan pertama:
Kelasnya di bawah.
sumber
tc
(hanyaTypeConverter
) satu kali saja.TypeConverter
lambat karena menggunakan refleksi untuk mencariTypeConverterAttribute
. Jika Anda menginisialisasiTypeConverter
bidang pribadi tunggal , maka Anda harus dapat menggunakan kembaliTypeConverter
berkali-kali.object
, melempar pengecualian. Saya bisa mengatasinya dengan menggunakan `if (typeof (T) .IsPrimitive) {return TConverter.ChangeType <T> (StringValue); } else {object o = (object) StringValue; kembali ke; } `sebagai pengganti untuk sampel PenggunaanTConverter.ChangeType<T>(StringValue)
Untuk banyak jenis (integer, dobel, DateTime dll), ada metode Parse statis. Anda dapat memintanya menggunakan refleksi:
sumber
TypeDescriptor
adalah metodeGetConvertor
yang memiliki kelas yang menerimaType
objek dan kemudian Anda dapat memanggilConvertFrom
metode untuk mengonversi objekvalue
yang ditentukan.sumber
Anda bisa menggunakan konstruk seperti kelas sifat . Dengan cara ini, Anda akan memiliki kelas pembantu parameterised yang tahu cara mengkonversi string ke nilai jenisnya sendiri. Maka rajin giat Anda akan terlihat seperti ini:
Sekarang, saya harus menunjukkan bahwa pengalaman saya dengan tipe parameter terbatas pada C ++ dan templatnya, tapi saya membayangkan ada beberapa cara untuk melakukan hal yang sama menggunakan generik C #.
sumber
Periksa statis
Nullable.GetUnderlyingType
. - Jika tipe yang mendasarinya adalah nol, maka parameter templatnya tidakNullable
, dan kita bisa menggunakan tipe itu secara langsung - Jika tipe yang mendasarinya bukan nol, maka gunakan tipe yang mendasarinya dalam konversi.Tampaknya bekerja untuk saya:
sumber
Dengan inspirasi dari jawaban Bob , ekstensi ini juga mendukung konversi nilai nol dan semua konversi primitif kembali dan keempat.
Contohnya
sumber
Saya menggunakan konversi melalui suatu objek. Ini sedikit lebih sederhana.
sumber
Saya menggunakan jawaban lobos dan berfungsi. Tapi saya punya masalah dengan konversi ganda karena pengaturan budaya. Jadi saya menambahkan
sumber
Namun variasi lain. Menangani Nullables, serta situasi di mana string adalah nol dan T tidak dapat dibatalkan.
sumber
Anda dapat melakukannya dalam satu baris seperti di bawah ini:
Selamat coding;)
sumber