Saya pernah mendengar tentang nama obat generik di .NET 2.0, tetapi belum digunakan dalam pengembangan sebenarnya.
Baru-baru ini saya mengalaminya saat pengembangan program website Blog Park.
Skenario aplikasi:
Baca pengaturan email terkait di file konfigurasi melalui deserialisasi.
Contoh file konfigurasi:
<Pengaturan Konfigurasi Blog>
<Pengaturan Email>
<MailSetting Name="ApproveEmail" SmtpServer="smtp.126.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
<MailSetting Name="ContactEmail" SmtpServer="smtp.163.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
</Pengaturan Email>
</BlogConfigurationSettings>
Deskripsi fungsi:
Melalui file konfigurasi, atribut MailSettings dari instance BlogConfigurationSettings diperoleh melalui deserialisasi, dan kemudian MailSetting yang sesuai diperoleh sesuai dengan kata kunci, misalnya: MailSetting bernama ApproveEmail.
Definisi Pengaturan Surat:
Pengaturan Surat
[Dapat diserialkan]
Pengaturan Mail kelas publik
{
string pribadi _nama;
[XmlAttribute("Nama")]
Nama string publik
{
dapatkan { kembalikan _nama }
setel { _nama = nilai }
}
string pribadi _smtpServer;
[XmlAttribute("SmtpServer")]
string publik SmtpServer
{
dapatkan { kembali _smtpServer }
setel { _smtpServer = nilai }
}
string pribadi _mailFrom;
[XmlAttribute("MailFrom")]
string publik MailFrom
{
dapatkan { return _mailFrom }
setel { _mailFrom = nilai;
}
string pribadi _nama pengguna;
[XmlAttribute("Nama Pengguna")]
Nama Pengguna string publik
{
dapatkan { kembalikan _nama pengguna }
setel { _nama pengguna = nilai;
}
string pribadi _kata sandi;
[XmlAttribute("Kata Sandi")]
kata sandi string publik
{
dapatkan { kembalikan _kata sandi }
setel { _kata sandi = nilai;
}
Kunci string publik
{
dapatkan { kembalikan ini.Nama }
}
}
Jika kita tidak menggunakan obat generik, kita bisa mengimplementasikannya melalui array atau kelas koleksi.
Untuk array, kita perlu mendefinisikannya di BlogConfigurationSettings:
Pengaturan Surat pribadi [] __mailSettings;
[XmlArray("Pengaturan Email")]
Pengaturan Surat publik [] Pengaturan Surat
{
dapatkan { kembalikan ini._mailSettings }
atur { this._mailSettings = nilai }
}Kita juga perlu menulis metode untuk menghitung elemen array dan mengembalikan MailSetting yang sesuai berdasarkan kata kunci.
Untuk kelas koleksi, Anda perlu mendefinisikan ini di BlogConfigurationSettings:
MailSettingCollection _mailSettings pribadi;
[XmlArray("Pengaturan Email")]
Pengaturan Surat MailSettingColletion publik
{
dapatkan { kembalikan ini._mailSettings }
atur { this._mailSettings = nilai }
}Kita perlu menulis kelas MailSettingCollection, dan mengimplementasikan metode di MailSettingCollection untuk menemukan MailSetting yang sesuai berdasarkan kata kunci.
Untuk generik, kita hanya perlu mendefinisikan yang berikut ini di BlogConfigurationSettings:
Daftar pribadi<MailSetting> _mailSettings;
[XmlArray("Pengaturan Email")]
Daftar publik<MailSetting> MailSettings
{
dapatkan { return _mailSettings }
setel { _mailSettings = nilai;}
}
Kemudian hanya baris kode berikut yang bisa mendapatkan MailSetting yang sesuai berdasarkan kata kunci:
BlogConfigurationSettings.MailSettings.Find(delegate(MailSetting mailSetting) { return mailSetting.Key == "ApproveEmail"; })
Tipe parameter metode Find adalah Predicate<T>, dan definisinya adalah:
delegasi publik bool Predikat<T>(T obj)
Artinya, tipe delegasi yang parameternya generik dan nilai kembaliannya bool.
Fungsi Find adalah untuk menghitung elemen dalam Daftar<T> dan memanggil delegasi dengan setiap elemen sebagai parameter delegasi. Metode delegasi sebenarnya diteruskan melalui parameter Find. Ketika delegasi yang dipanggil mengembalikan nilai true, elemen saat ini adalah kembali.
Anda juga dapat menulis kode pada parameter Temukan di atas sebagai metode terpisah, lalu menggunakan nama metode sebagai parameter Temukan.
BlogConfigurationSettings.MailSettings.Find(IsMe);
bool publik IsMe(Pengaturan MailPengaturan mail)
{
return mailSetting.Key == "SetujuiEmail";
}
Anda akan langsung merasa tidak nyaman dengan kode seperti itu. Mengapa tidak menulis metode untuk setiap kata kunci?
public bool IsMe (MailSetting mailSetting, kunci string)
{
return mailSetting.Key == kunci;
}
Tentu saja bagus untuk menulisnya seperti ini, tetapi Find tidak setuju. Parameternya hanya diperbolehkan untuk metode dengan satu parameter.
Lalu bagaimana cara mengatasi masalah ini?
Solusi yang saya pikirkan adalah dengan menulis kelas MailSettingPredicate:
MailSettingPredicate kelas publik
{
kunci string pribadi;
Kunci string publik
{
dapatkan { kunci pengembalian; }
setel { kunci = nilai }
}
public bool IsMe (Pengaturan Surat MailSetting)
{
return mailSetting.Key == this.key;
}
}
Sebelum memanggil IsMe, atur terlebih dahulu nilai MailSettingManager.Key Kodenya adalah sebagai berikut:
Predikat MailSettingPredicate= new MailSettingPredicate();
predikat.Key = "SetujuiEmail";
Config.Settings.MailSettings.Find(predikat.IsMe);
predikat.Key = "KontakEmail";
Config.Settings.MailSettings.Find(predikat.IsMe);
Saya baru saja menggunakan obat generik .NET 2.0 dalam pengembangan sebenarnya. Artikel ini saya tulis untuk memperdalam pemahaman saya, dan saya juga berharap dapat memberikan beberapa referensi bagi teman-teman yang belum mengenal obat generik .NET 2.0. Anda dipersilakan untuk menunjukkan kekurangannya.