การกำหนดวิธีการให้กับเหตุการณ์บนการควบคุมผู้ใช้ที่ประกาศในอินเทอร์เฟซ

ใน C# ฉันกำลังสร้างการควบคุมแบบกำหนดเองเพื่อใช้ในแอปพลิเคชันแบบกำหนดเอง ฉันต้องการให้การควบคุมแต่ละรายการดำเนินเหตุการณ์ที่จะเริ่มทำงานหากมีข้อยกเว้นหรือข้อผิดพลาด (ความล้มเหลวในการตรวจสอบภายใน) เกิดขึ้นภายในการควบคุม ฉันสร้างอินเทอร์เฟซที่ประกาศเหตุการณ์ ฉันสร้างการควบคุมผู้ใช้ที่ใช้อินเทอร์เฟซ นี่คือปัญหาของฉัน

เมื่อฉันเพิ่มตัวควบคุมแบบกำหนดเองตัวใดตัวหนึ่งลงในแบบฟอร์ม ฉันต้องการวนซ้ำตัวควบคุมบนแบบฟอร์ม ตรวจหาตัวควบคุมทั้งหมดที่เป็นตัวควบคุมแบบกำหนดเองของฉัน จากนั้นกำหนดตัวจัดการเหตุการณ์ให้กับเหตุการณ์ที่ฉันประกาศในอินเทอร์เฟซ ฉันไม่สามารถหาวิธีแปลงวัตถุให้เป็นประเภทของอินเทอร์เฟซได้

พิจารณา:

interface IMyInterface
{
    event ControlExceptionOccured ControlExceptionOccuredEvent;
...
}

public partial class TextControl : UserControl, IMyInterface {
...
  public event ControlExceptionOccured ControlExceptionOccuredEvent;
...
}

และในแบบฟอร์มของฉัน ฉันใช้ TextControls อันใดอันหนึ่งเหล่านี้ ฉันมีวิธีนี้:

private void Form1_Load(object sender, EventArgs e)
{
  foreach (Control Control in Controls)
  {
    if (Control.GetType().GetInterface(typeof(IMyInterface).FullName) != null)
    {
       ((IMyInterface)Control).ControlExceptionOccuredEvent += ControlExceptionHandler;
    }
  }
}

สิ่งนี้สอดคล้องแต่จะไม่ดำเนินการ ฉันจะเพิ่ม ControlExceptionHandler ให้กับห่วงโซ่เหตุการณ์ได้อย่างไร

ฉันขอขอบคุณทุกคนที่พยายามช่วย


person Mike L.    schedule 05.07.2011    source แหล่งที่มา
comment
คุณหมายถึงอะไรโดยจะไม่ดำเนินการ? มีเหตุผลใดบ้างที่ไม่ใช้ if (Control is IMyInterface) แทนที่จะโทร GetType ฯลฯ   -  person Jon Skeet    schedule 06.07.2011


คำตอบ (3)


เท่าที่ฉันเข้าใจว่า yuo ไม่สามารถสมัครรับกิจกรรมได้เนื่องจากเงื่อนไข IF ส่งคืน FALSE yuo พยายามเขียนอะไรแบบนี้หรือเปล่า? : :

foreach(Control ctrl in this.Controls){
    if((ctrl as IMyInterface) != null) {
        //do stuff
    }
}
person Tigran    schedule 05.07.2011
comment
นั่นก็เหมือนกับ if (ctrl is IMyInterface) {do stuff} - person Igby Largeman; 06.07.2011

นี่เป็นวิธีที่ง่ายกว่าในการทำ:

if (control is IMyInterface)
    ((IMyInterface)control).ControlExceptionOccuredEvent += ControlExceptionHandler;

... แต่วิธีที่คุณทำก็ควรจะได้ผลเช่นกัน ดังนั้นคุณจะต้องให้รายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่เกิดขึ้น

person Igby Largeman    schedule 05.07.2011

รหัส

((IMyInterface)Control).ControlExceptionOccuredEvent += ControlExceptionHandler;

สร้างขึ้น

ไม่สามารถส่งวัตถุประเภท '...Text.TextControl' เพื่อพิมพ์ 'IMyInterface'

ฉันไม่เข้าใจว่าทำไมไม่

ตามบันทึกด้านข้างฉันแทนที่

if (Control.GetType().GetInterface(typeof(IMyInterface).FullName) != null)

กับ

if (Control is IMyInterface)

และมันใช้งานไม่ได้ ตัวอย่างที่สองไม่เคยส่งกลับค่าจริง ฉันยังพยายาม

if ((Control as IMyInterface) != null)

และมันไม่เคยกลับมาเป็นจริงอีกเลย

person Mike Landi    schedule 06.07.2011