C # สะท้อน (Reflection)
สะท้อนให้เห็นถึงวิธีการที่สามารถเข้าถึงโปรแกรม, ความสามารถในการตรวจจับและปรับเปลี่ยนสถานะของตัวเองหรือพฤติกรรม
สภามีโมดูลซึ่งมีประเภทซึ่งจะมีสมาชิก สะท้อนให้แพคเกจประกอบวัตถุโมดูลและประเภท
คุณสามารถใช้การสะท้อนแบบไดนามิกสร้างตัวอย่างของประเภทที่พิมพ์ถูกผูกไว้กับวัตถุที่มีอยู่หรือได้รับชนิดจากวัตถุที่มีอยู่ จากนั้นคุณสามารถเรียกประเภทของวิธีการหรือเข้าถึงทุ่งนาและคุณสมบัติของ
ข้อดีและข้อเสีย
ข้อดี:
- 1 สะท้อนให้เห็นถึงความยืดหยุ่นในการปรับปรุงกระบวนการและความยืดหยุ่น
- 2 ลดการมีเพศสัมพันธ์เพิ่มกำลังการผลิตปรับตัว
- 3 ซึ่งจะช่วยให้โปรแกรมในการสร้างและควบคุมประเภทของวัตถุใด ๆ โดยไม่ต้องระดับเป้าหมายก่อนกำหนดค่าตายตัว
ข้อเสีย:
- 1, ปัญหาการปฏิบัติงาน: ใช้งานเป็นหลักสะท้อนการอธิบายการดำเนินการเมื่อเขตข้อมูลและวิธีการสำหรับการเข้าถึงได้ช้ากว่ารหัสโดยตรง จึงสะท้อนในหลักกรอบความยืดหยุ่นในการใช้งานและขยายขีดความสามารถเรียกร้องขั้นตอนทั่วไปไม่แนะนำ
- 2, การใช้สะท้อนเลือนภายในตรรกะโปรแกรม; โปรแกรมเมอร์ต้องการที่จะเห็นตรรกะในรหัสที่มา แต่สะท้อนข้ามเทคโนโลยี Source Code ซึ่งจะนำมาซึ่งปัญหาการบำรุงรักษาและรหัสสะท้อนความซับซ้อนกว่ารหัสตรงกันโดยตรง .
สะท้อน (Reflection) ใช้
สะท้อน (Reflection) เพื่อวัตถุประสงค์ดังต่อไปนี้:
- จะช่วยให้คุณดูคุณสมบัติที่รันไทม์ (แอตทริบิวต์) ข้อมูล
- จะช่วยให้การตรวจสอบคอลเลกชันของประเภทต่างๆรวมทั้งเป็นตัวอย่างของประเภทนี้
- จะช่วยให้ปลายที่มีผลผูกพันของวิธีการและคุณสมบัติ (ทรัพย์สิน)
- มันช่วยให้การสร้างรูปแบบใหม่ในเวลาทำงานและจากนั้นใช้ประเภทนี้ดำเนินการบางอย่าง
ดูข้อมูลเมตา
เราได้กล่าวแล้วในส่วนข้างต้นการใช้งานของการสะท้อน (Reflection) สามารถดูคุณสมบัติ (แอตทริบิวต์) ข้อมูล
วัตถุชั้นSystem.Reflection MemberInfoจะต้องมีการเริ่มต้นสำหรับการค้นพบคุณสมบัติที่เกี่ยวข้องกับการเรียน (แอตทริบิวต์) เดอะ การทำเช่นนี้คุณสามารถกำหนดระดับวัตถุเป้าหมายดังต่อไปนี้:
ข้อมูล System.Reflection.MemberInfo = typeof (MyClass);
โปรแกรมต่อไปนี้แสดงให้เห็นถึงจุดนี้:
การใช้ระบบ [AttributeUsage (AttributeTargets.All)] HelpAttribute ระดับส่วนกลาง: System.Attribute { ประชาชน Url สตริงอ่านได้อย่างเดียว; สาธารณะ String กระทู้ // กระทู้เป็นชื่อ (ชื่อ) พารามิเตอร์ { ได้รับ { กลับหัวข้อ; } ชุด { หัวข้อ value =; } } ประชาชน HelpAttribute (String URL) // URL เป็นตำแหน่ง (ตำแหน่ง) พารามิเตอร์ { this.Url = URL; } หัวข้อ String เอกชน } [HelpAttribute ( "ข้อมูลเกี่ยวกับ MyClass ชั้น")] ระดับ MyClass { } AttributeAppl namespace { Program รุ่น { เป็นโมฆะคง main (String args []) { ข้อมูล System.Reflection.MemberInfo = typeof (MyClass); วัตถุ [] = แอตทริบิวต์ info.GetCustomAttributes (จริง); for (int i = 0; I <attributes.Length; i ++) { System.Console.WriteLine (แอตทริบิวต์ [I]); } Console.ReadKey (); } } }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะแสดงคุณสมบัติแบบกำหนดเองที่แนบมากับMyClassชั้นบน:
HelpAttribute
ตัวอย่าง
ในตัวอย่างนี้เราจะใช้DeBugInfoคุณสมบัติที่สร้างขึ้นในบทที่ผ่านมาและใช้สะท้อน (Reflection)เพื่ออ่านข้อมูลเมตาชั้นสี่เหลี่ยมผืนผ้า
การใช้ระบบ using System.Reflection; namespace BugFixApplication { แก้ไขข้อผิดพลาด // คุณสมบัติที่กำหนดเองได้รับมอบหมายในชั้นเรียนและสมาชิก [AttributeUsage (AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] DeBugInfo ระดับส่วนกลาง: System.Attribute { ส่วนตัว int Bugno; นักพัฒนา String เอกชน lastReview String เอกชน ข้อความสาธารณะ String; ประชาชน DeBugInfo (BG int สตริง dev สตริง D) { this.bugNo = BG; this.developer = dev; this.lastReview = d; } int สาธารณะ Bugno { ได้รับ { กลับ Bugno; } } ผู้พัฒนาสตริงสาธารณะ { ได้รับ { กลับนักพัฒนา; } } สาธารณะ String LastReview { ได้รับ { กลับ lastReview; } } สาธารณะ String ข้อความ { ได้รับ { ข้อความกลับมา } ชุด { ข้อความ value =; } } } [DeBugInfo (45, "ซาร่าอาลี", "2012/12/08" ข้อความ = "กลับไม่ตรงกันชนิด")] [DeBugInfo (49 "Nuha อาลี", "10/10/2012" ข้อความ = "ตัวแปรที่ไม่ได้ใช้")] ระดับสี่เหลี่ยมผืนผ้า { // ตัวแปรสมาชิกที่มีการป้องกันความยาวคู่ การป้องกันความกว้างคู่ สี่เหลี่ยมผืนผ้าสาธารณะ (L คู่คู่ W) { ความยาว = l; width = W; } [DeBugInfo (55, "ซาร่าอาลี", "19/10/2012" ข้อความ = "กลับไม่ตรงกันชนิด")] GetArea คู่สาธารณะ () { กลับความยาวความกว้าง *; } [DeBugInfo (56, "ซาร่าอาลี", "19/10/2012")] โมฆะสาธารณะจอแสดงผล () { Console.WriteLine ( "ความยาว: {0}", ความยาว); Console.WriteLine ( "ความกว้าง: {0}" กว้าง); Console.WriteLine ( "พื้นที่: {0}" GetArea ()); } } // สี่เหลี่ยมผืนผ้าระดับ End ระดับ ExecuteRectangle { เป็นโมฆะคง main (String args []) { สี่เหลี่ยมผืนผ้า r = สี่เหลี่ยมผืนผ้าใหม่ (4.5, 7.5); r.Display (); ประเภท type = typeof (สี่เหลี่ยมผืนผ้า); // ทราเวิร์ระดับสี่เหลี่ยมผืนผ้าแอตทริบิวต์ foreach (Object แอตทริบิวต์ใน type.GetCustomAttributes (เท็จ)) { DeBugInfo DBI = (DeBugInfo) แอตทริบิวต์; ถ้า null (! = DBI) { Console.WriteLine ( "ข้อผิดพลาดไม่มี: {0}" dbi.BugNo); Console.WriteLine ( "ผู้พัฒนา: {0}" dbi.Developer); Console.WriteLine ( "ล่าสุดทาน: {0}" dbi.LastReview); Console.WriteLine ( "ข้อสังเกต: {0}" dbi.Message); } } // วิธีย้ำแอตทริบิวต์ foreach (MethodInfo เมตร type.GetMethods ()) { foreach (Attribute ใน m.GetCustomAttributes (จริง)) { DeBugInfo DBI = (DeBugInfo บริการ); ถ้า null (! = DBI) { Console.WriteLine ( "ข้อผิดพลาดไม่มี: {0} สำหรับวิธีการ: {1}" dbi.BugNo, m.Name); Console.WriteLine ( "ผู้พัฒนา: {0}" dbi.Developer); Console.WriteLine ( "ล่าสุดทาน: {0}" dbi.LastReview); Console.WriteLine ( "ข้อสังเกต: {0}" dbi.Message); } } } Console.ReadLine (); } } }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
ความยาว: 4.5 ความกว้าง: 7.5 พื้นที่: 33.75 ข้อผิดพลาดไม่มี: 49 ผู้พัฒนา: Nuha อาลี ดูครั้งสุดท้าย: 10/10/2012 ข้อสังเกต: ตัวแปรที่ไม่ได้ใช้ ข้อผิดพลาดไม่มี: 45 ผู้พัฒนา: ซาร่าอาลี ดูครั้งสุดท้าย: 2012/12/08 ข้อสังเกต: ประเภทกลับไม่ตรงกัน ข้อผิดพลาดไม่มี: 55 สำหรับวิธีการ: GetArea ผู้พัฒนา: ซาร่าอาลี ดูครั้งสุดท้าย: 19/10/2012 ข้อสังเกต: ประเภทกลับไม่ตรงกัน ข้อผิดพลาดไม่มี: 56 สำหรับวิธีการ: การแสดงผล ผู้พัฒนา: ซาร่าอาลี ดูครั้งสุดท้าย: 19/10/2012 ข้อสังเกต: