ฉันเคยได้ยินเกี่ยวกับชื่อสามัญใน .NET 2.0 แต่ไม่ได้ใช้ในการพัฒนาจริง
ฉันเพิ่งพบมันในระหว่างการพัฒนาโปรแกรมเว็บไซต์ Blog Park
สถานการณ์การใช้งาน:
อ่านการตั้งค่าเมลที่เกี่ยวข้องในไฟล์คอนฟิกูเรชันผ่านการดีซีเรียลไลซ์
ตัวอย่างไฟล์การกำหนดค่า:
<การตั้งค่าบล็อกการกำหนดค่า>
<การตั้งค่าเมล>
<MailSetting Name = "ApproveEmail" SmtpServer = "smtp.126.com" EmailFrom = "" ชื่อผู้ใช้ = "" PassWord = "" ></ MailSetting>
<MailSetting Name = "ContactEmail" SmtpServer = "smtp.163.com" EmailFrom = "" ชื่อผู้ใช้ = "" PassWord = "" ></ MailSetting>
</การตั้งค่าเมล>
</การตั้งค่าการตั้งค่าบล็อก>
คำอธิบายฟังก์ชัน:
ผ่านไฟล์คอนฟิกูเรชัน แอ็ตทริบิวต์ MailSettings ของอินสแตนซ์ BlogConfigurationSettings จะได้รับผ่านการดีซีเรียลไลซ์ จากนั้นจะได้รับ MailSetting ที่เกี่ยวข้องตามคีย์เวิร์ด ตัวอย่างเช่น MailSetting ชื่อ ApproveEmail
คำจำกัดความของ MailSetting:
การตั้งค่าเมล
[สามารถซีเรียลไลซ์ได้]
MailSetting คลาสสาธารณะ
-
สตริงส่วนตัว _name;
[XmlAttribute("ชื่อ")]
ชื่อสตริงสาธารณะ
-
รับ { กลับ _name }
ตั้งค่า { _name = ค่า; }
}
สตริงส่วนตัว _smtpServer;
[XmlAttribute("SmtpServer")]
สตริงสาธารณะ SmtpServer
-
รับ { กลับ _smtpServer }
ตั้งค่า { _smtpServer = ค่า }
}
สตริงส่วนตัว _mailFrom;
[XmlAttribute("MailFrom")]
MailFrom สตริงสาธารณะ
-
รับ { กลับ _mailFrom; }
ตั้งค่า { _mailFrom = ค่า }
}
สตริงส่วนตัว _ชื่อผู้ใช้;
[XmlAttribute("ชื่อผู้ใช้")]
ชื่อผู้ใช้สตริงสาธารณะ
-
รับ { กลับ _ชื่อผู้ใช้ }
ตั้งค่า { _ชื่อผู้ใช้ = ค่า }
}
สตริงส่วนตัว _password;
[XmlAttribute("รหัสผ่าน")]
รหัสผ่านสตริงสาธารณะ
-
รับ { กลับ _รหัสผ่าน }
ตั้งค่า { _password = ค่า }
}
คีย์สตริงสาธารณะ
-
รับ { ส่งคืนชื่อนี้ }
-
-
หากเราไม่ใช้ยาสามัญ เราก็สามารถนำไปใช้ผ่านอาร์เรย์หรือคลาสคอลเลกชันได้
สำหรับอาร์เรย์ เราต้องกำหนดสิ่งนี้ใน BlogConfigurationSettings:
MailSetting ส่วนตัว [] __mailSettings;
[XmlArray("การตั้งค่าเมล")]
MailSetting สาธารณะ [] MailSettings
-
รับ { คืนสิ่งนี้._mailSettings }
ตั้งค่า { this._mailSettings = ค่า;
}เรายังต้องเขียนวิธีการระบุองค์ประกอบอาร์เรย์และส่งกลับ MailSetting ที่เกี่ยวข้องตามคำหลัก
สำหรับคลาสคอลเลกชัน คุณต้องกำหนดสิ่งนี้ใน BlogConfigurationSettings:
MailSettingCollection ส่วนตัว _mailSettings;
[XmlArray("การตั้งค่าเมล")]
MailSettingColletion MailSettings สาธารณะ
-
รับ { คืนสิ่งนี้._mailSettings }
ตั้งค่า { this._mailSettings = ค่า;
}เราจำเป็นต้องเขียนคลาส MailSettingCollection และใช้วิธีใน MailSettingCollection เพื่อค้นหา MailSetting ที่เกี่ยวข้องตามคำหลัก
สำหรับข้อมูลทั่วไป เราจำเป็นต้องกำหนดสิ่งต่อไปนี้ใน BlogConfigurationSettings เท่านั้น:
รายการส่วนตัว <MailSetting> _mailSettings;
[XmlArray("การตั้งค่าเมล")]
รายการสาธารณะ <MailSetting> MailSettings
-
รับ { กลับ _mailSettings;
ตั้งค่า { _mailSettings = ค่า;}
-
จากนั้นเพียงบรรทัดโค้ดต่อไปนี้สามารถรับ MailSetting ที่เกี่ยวข้องตามคำหลัก:
BlogConfigurationSettings.MailSettings.Find (ผู้รับมอบสิทธิ์ (MailSetting mailSetting) { return mailSetting.Key == "ApproveEmail"; })
ประเภทพารามิเตอร์ของวิธีการ Find คือ Predicate<T> และคำจำกัดความคือ:
บูลผู้แทนสาธารณะภาคแสดง<T>(T obj)
นั่นคือประเภทผู้รับมอบสิทธิ์ซึ่งมีพารามิเตอร์ทั่วไปและมีค่าส่งคืนเป็นบูล
ฟังก์ชันของ Find คือการแจกแจงองค์ประกอบในรายการ <T> และเรียกผู้รับมอบสิทธิ์ด้วยแต่ละองค์ประกอบเป็นพารามิเตอร์ของผู้รับมอบสิทธิ์ วิธีการมอบสิทธิ์จริงจะถูกส่งผ่านพารามิเตอร์ Find เมื่อผู้รับมอบสิทธิ์ที่ถูกเรียกส่งคืนค่าจริง องค์ประกอบปัจจุบันจะถูกส่งกลับ กลับมา
คุณยังสามารถเขียนโค้ดในพารามิเตอร์ Find ด้านบนเป็นวิธีการแยกต่างหาก จากนั้นใช้ชื่อวิธีการเป็นพารามิเตอร์ของ Find
BlogConfigurationSettings.MailSettings.Find (IsMe);
บูลสาธารณะ IsMe (MailSetting mailSetting)
-
กลับ mailSetting.Key == "อนุมัติอีเมล";
-
คุณจะรู้สึกไม่สบายใจกับโค้ดดังกล่าวทันที ทำไมไม่เขียนวิธีการสำหรับคีย์เวิร์ดแต่ละคำล่ะ
บูลสาธารณะ IsMe (MailSetting mailSetting, คีย์สตริง)
-
ส่งคืน mailSetting.Key == คีย์;
-
แน่นอนว่าเป็นการดีที่จะเขียนด้วยวิธีนี้ แต่ Find ไม่เห็นด้วย พารามิเตอร์ของมันได้รับอนุญาตให้เป็นวิธีการที่มีพารามิเตอร์ตัวเดียวเท่านั้น
แล้วจะแก้ไขปัญหานี้อย่างไร?
วิธีแก้ปัญหาที่ฉันคิดคือเขียนคลาส MailSettingPredicate:
MailSettingPredicate คลาสสาธารณะ
-
สตริงคีย์ส่วนตัว
คีย์สตริงสาธารณะ
-
รับ { รหัสส่งคืน }
ตั้งค่า { คีย์ = ค่า }
}
บูลสาธารณะ IsMe (MailSetting mailSetting)
-
กลับ mailSetting.Key == this.key;
-
-
ก่อนที่จะเรียก IsMe ให้ตั้งค่า MailSettingManager.Key ก่อน โดยโค้ดจะเป็นดังนี้:
ภาคแสดง MailSettingPredicate= ใหม่ MailSettingPredicate();
predicate.Key = "อนุมัติอีเมล";
Config.Settings.MailSettings.Find (ภาคแสดง IsMe);
predicate.Key = "อีเมลติดต่อ";
Config.Settings.MailSettings.Find (ภาคแสดง IsMe);
ฉันเพิ่งใช้ .NET 2.0 generics ในการพัฒนาจริง ฉันเขียนบทความนี้เพื่อทำความเข้าใจให้ลึกซึ้งยิ่งขึ้น ฉันยังหวังว่าจะให้ข้อมูลอ้างอิงแก่เพื่อน ๆ ที่ไม่คุ้นเคยกับ .NET 2.0 generics คุณสามารถชี้ให้เห็นข้อบกพร่องได้