国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

.NET2.0泛型的“近距離”實(shí)踐

2019-11-17 04:46:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  早聞.NET 2.0中泛型的大名,但一直未在實(shí)際開(kāi)發(fā)中使用。最近在開(kāi)發(fā)公司項(xiàng)目程序的過(guò)程中體驗(yàn)了一下。

  應(yīng)用場(chǎng)景:

  在配置文件中通過(guò)反序列化讀取相應(yīng)的郵件設(shè)置。

  配置文件示例:

<BlogConfigurationSettings>
<MailSettings>
<MailSetting Name="ApWord=""></MailSetting>
<MailSetting Name="ContactEmail" SmtpServer="smtp.163.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
</MailSettings>
</BlogConfigurationSettings>
  功能說(shuō)明:

  通過(guò)該配置文件,反序列化得到BlogConfigurationSettings實(shí)例的屬性MailSettings,然后根據(jù)要害字得到相應(yīng)的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; }
 }

}
  假如不使用泛型,我們可以通過(guò)數(shù)組或者集合類(lèi)來(lái)實(shí)現(xiàn)。對(duì)于數(shù)組,我們需要在BlogConfigurationSettings進(jìn)行這樣的定義:

private MailSetting [] __mailSettings;
[XmlArray("MailSettings")]
public MailSetting [] MailSettings
{
 get { return this._mailSettings; }
 set { this._mailSettings = value; }
}
  我們還需要寫(xiě)一個(gè)方法去枚舉數(shù)組元素,根據(jù)要害字返回相應(yīng)的MailSetting。

  對(duì)于集合類(lèi),需要在BlogConfigurationSettings進(jìn)行這樣的定義:

private MailSettingColletion _mailSettings;
[XmlArray("MailSettings")]
public MailSettingColletion MailSettings
{
 get { return this._mailSettings; }
 set { this._mailSettings = value; }
}
  接下來(lái)我們需要寫(xiě)一個(gè)MailSettingColletion類(lèi), 并且在MailSettingColletion中實(shí)現(xiàn)一個(gè)方法去根據(jù)要害字查找相應(yīng)的MailSetting。

  對(duì)于泛型,我們只要在BlogConfigurationSettings進(jìn)行如下的定義:

private List<MailSetting> _mailSettings;
[XmlArray("MailSettings")]
public List<MailSetting> MailSettings
{
 get { return _mailSettings; }
 set { _mailSettings = value;}
}
  然后只需下面的一行代碼就能根據(jù)要害字得到相應(yīng)的MailSetting:


BlogConfigurationSettings.MailSettings.Find(delegate(MailSetting mailSetting) { return mailSetting.Key == "ApproveEmail"; })
  Find方法的參數(shù)類(lèi)型是Predicate<T>,它的定義是:

public delegate bool Predicate<T>(T obj)
  也就是一個(gè)參數(shù)為泛型,返回值為bool的委托類(lèi)型。

  Find的功能就是枚舉List<T>中的元素,并以每個(gè)元素作為委托的參數(shù)調(diào)用委托,實(shí)際的委托方法是通過(guò)Find參數(shù)傳遞過(guò)來(lái)的,當(dāng)調(diào)用的委托返回true時(shí),返回當(dāng)前元素。

  你也可以將上面的Find參數(shù)中的代碼寫(xiě)為一個(gè)單獨(dú)的方法,然后將方法名作為Find的參數(shù)。

BlogConfigurationSettings.MailSettings.Find(IsMe);
public bool IsMe(MailSetting mailSetting)
{
return mailSetting.Key == "ApproveEmail";
}
  對(duì)于這樣的代碼,你立即會(huì)感到不舒適,這樣豈不要為每個(gè)要害字寫(xiě)一個(gè)方法,你想應(yīng)該這樣寫(xiě):

public bool IsMe(MailSetting mailSetting,string key)
{
return mailSetting.Key == key;
}
  這樣寫(xiě)當(dāng)然好啊,可是Find卻不同意,它的參數(shù)只答應(yīng)是帶有一個(gè)參數(shù)的方法。

  那如何解決這個(gè)問(wèn)題呢?

  我想到的一個(gè)解決方法,寫(xiě)一個(gè)MailSettingPredicate類(lèi):

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;
}
}
  在調(diào)用IsMe之前,先設(shè)置MailSettingManager.Key的值,代碼如下:

MailSettingPredicate predicate= new MailSettingPredicate();
predicate.Key = "ApproveEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
predicate.Key = "ContactEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
  我在實(shí)際開(kāi)發(fā)中剛剛使用.NET 2.0的泛型,寫(xiě)這篇文章是想加深自己的理解,同時(shí)希望給不熟悉.NET 2.0泛型的朋友提供一點(diǎn)參考,不足之處,歡迎您指出。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 自贡市| 桑植县| 海伦市| 灵石县| 景德镇市| 青浦区| 华容县| 郧西县| 紫云| 广丰县| 景东| 长白| 凤阳县| 浏阳市| 江孜县| 东乡族自治县| 安远县| 寻乌县| 岚皋县| 丰原市| 会宁县| 梅州市| 阜城县| 濉溪县| 赫章县| 海门市| 犍为县| 奉贤区| 太原市| 朔州市| 海淀区| 平定县| 遵义县| 灵山县| 龙泉市| 台南市| 靖江市| 岚皋县| 留坝县| 蒲江县| 留坝县|