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

首頁 > 學院 > 開發設計 > 正文

.NET 2.0 泛型在實際開發中的一次小應用

2019-11-18 17:17:51
字體:
來源:轉載
供稿:網友

早聞.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泛型的朋友提供一點參考,不足之處,歡迎您指出。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 曲沃县| 沧源| 故城县| 长治市| 师宗县| 河南省| 抚顺市| 乌鲁木齐县| 荔波县| 招远市| 宜宾市| 屯门区| 翁源县| 息烽县| 富顺县| 广州市| 文成县| 上犹县| 松阳县| 娄烦县| 寿宁县| 伊吾县| 玉山县| 民勤县| 临泉县| 绥阳县| 丘北县| 库尔勒市| 汶上县| 五大连池市| 宾阳县| 琼结县| 屏东市| 乐都县| 普格县| 城市| 古田县| 金寨县| 法库县| 忻城县| 乌兰县|