早聞.NET 2.0中泛型的大名,但一直未在實際開發中使用。
最近在開發博客園網站程序的過程中體驗了一下。
應用場景:
在配置文件中通過反序列化讀取相應的郵件設置。
配置文件示例:
<BlogConfigurationSettings>
<MailSettings>
<MailSetting Name="ApWord=""></MailSetting>
<MailSetting Name="ContactEmail" SmtpServer="smtp.163.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
</MailSettings>
</BlogConfigurationSettings>
功能說明:
通過該配置文件,反序列化得到BlogConfigurationSettings實例的屬性MailSettings,然后根據關鍵字得到相應的MailSetting,比如:名為ApproveEmail的MailSetting。
MailSetting的定義:
MailSetting
[Serializable]
public class MailSetting
{
private string _name;
[xmlAttribute("Name")]
public string Name
{
get { return _name; }
set { _name = value; }
}
private string _smtpServer;
[XmlAttribute("SmtpServer")]
public string SmtpServer
{
get { return _smtpServer; }
set { _smtpServer = value; }
}
private string _mailFrom;
[XmlAttribute("MailFrom")]
public string MailFrom
{
get { return _mailFrom; }
set { _mailFrom = value; }
}
private string _username;
[XmlAttribute("UserName")]
public string UserName
{
get { return _username; }
set { _username = value; }
}
private string _password;
[XmlAttribute("Password")]
public string Password
{
get { return _password; }
set { _password = value; }
}
public string Key
{
get { return this.Name; }
}
}
如果不使用泛型,我們可以通過數組或者集合類來實現。
對于數組,我們需要在BlogConfigurationSettings進行這樣的定義:
private MailSetting [] __mailSettings;
[XmlArray("MailSettings")]
public MailSetting [] MailSettings
{
get { return this._mailSettings; }
set { this._mailSettings = value; }
}我們還需要寫一個方法去枚舉數組元素,根據關鍵字返回相應的MailSetting。
對于集合類,需要在BlogConfigurationSettings進行這樣的定義:
private MailSettingColletion _mailSettings;
[XmlArray("MailSettings")]
public MailSettingColletion MailSettings
{
get { return this._mailSettings; }
set { this._mailSettings = value; }
}我們需要寫一個MailSettingColletion類, 并且在MailSettingColletion中實現一個方法去根據關鍵字查找相應的MailSetting。
對于泛型,我們只要在BlogConfigurationSettings進行如下的定義:
private List<MailSetting> _mailSettings;
[XmlArray("MailSettings")]
public List<MailSetting> MailSettings
{
get { return _mailSettings; }
set { _mailSettings = value;}
}
然后只需下面的一行代碼就能根據關鍵字得到相應的MailSetting:
BlogConfigurationSettings.MailSettings.Find(delegate(MailSetting mailSetting) { return mailSetting.Key == "ApproveEmail"; })
Find方法的參數類型是Predicate<T>,它的定義是:
public delegate bool Predicate<T>(T obj)
也就是一個參數為泛型,返回值為bool的委托類型。
Find的功能就是枚舉List<T>中的元素,并以每個元素作為委托的參數調用委托,實際的委托方法是通過Find參數傳遞過來的,當調用的委托返回true時,返回當前元素。
你也可以將上面的Find參數中的代碼寫為一個單獨的方法,然后將方法名作為Find的參數。
BlogConfigurationSettings.MailSettings.Find(IsMe);
public bool IsMe(MailSetting mailSetting)
{
return mailSetting.Key == "ApproveEmail";
}
對于這樣的代碼,你立即會感到不舒服,這樣豈不要為每個關鍵字寫一個方法,你想應該這樣寫:
public bool IsMe(MailSetting mailSetting,string key)
{
return mailSetting.Key == key;
}
這樣寫當然好啊,可是Find卻不同意,它的參數只允許是帶有一個參數的方法。
那如何解決這個問題呢?
我想到的一個解決方法,寫一個MailSettingPredicate類:
public class MailSettingPredicate
{
private string key;
public string Key
{
get { return key; }
set { key = value; }
}
public bool IsMe(MailSetting mailSetting)
{
return mailSetting.Key == this.key;
}
}
在調用IsMe之前,先設置MailSettingManager.Key的值,代碼如下:
MailSettingPredicate predicate= new MailSettingPredicate();
predicate.Key = "ApproveEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
predicate.Key = "ContactEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
我在實際開發中剛剛使用.NET 2.0的泛型,寫這篇文章是想加深自己的理解,同時希望給不熟悉.NET 2.0泛型的朋友提供一點參考,不足之處,歡迎您指出。
新聞熱點
疑難解答