2010-10-22 33 views
9

Tôi muốn tạo một EventHandler tùy chỉnh có thể có bất kỳ số lượng đối tượng nào như các tham số của nó và các đối tượng mà nó không được biết trước.C# - Tạo EventHandler có thể lấy số tham số

Tôi biết tôi có thể vượt qua nó một Object [] nhưng những gì tôi muốn là một cái gì đó tương tự như

MyEventHandler someCustomEvent(Object obj1, Object obj2, Object obj3) 

nơi số lượng đối tượng có thể là 0 hoặc 10 nếu cần thiết.

EDIT:

Vì vậy, nhờ vào các ý kiến ​​và câu trả lời tôi đã bị tôi đã đến đây,

public class FinishedEventArgs : EventArgs { 
      public Object[] Args{ get; set; } 
     } 

protected void OnFinished(params Object[] args) { 
      if(this.Finished != null) { 
       this.Finished(this, new FinishedEventArgs() { 
        Args = args 
       }); 
      } 
     } 

Liệu nó trông chấp nhận được?

+0

Làm thế nào về sử dụng 'params object [] args'? – shahkalpesh

+0

Cảm ơn bạn đã chỉ ra các thông số, khá nhiều những gì tôi đang tìm kiếm. Bây giờ làm thế nào tôi sẽ đi về việc sử dụng params với thực hành tốt nhất mà Kent đã viết trong câu trả lời của mình? –

+1

Có lẽ chúng tôi sẽ giải quyết tốt hơn vấn đề đã dẫn bạn đến giải pháp hiện tại này, hơn là cố gắng khắc phục giải pháp này. I E. định nghĩa trình xử lý sự kiện này có vẻ nghi ngờ, vậy vấn đề là nó thực sự giải quyết cho bạn là gì? Tại sao bạn không biết những gì các đối tượng bạn sẽ vượt qua để xử lý sự kiện? Tại sao họ không có lớp cha mẹ tốt hơn so với đối tượng? vv –

Trả lời

12

EventHandler chỉ là đại biểu.

Bạn có thể tạo đại biểu như thế này:

public delegate void Foo(params object[] args); 

Và sự kiện:

public event Foo Bar; 

Bạn sẽ kết thúc với sự kiện bắn như thế này:

Bar(1, ""); 

Nhưng, như @Kent Boogaart cho biết, bạn nên tạo sự kiện bằng cách sử dụng EventHandler<TEventArgs>, vì vậy cách tiếp cận tốt hơn sẽ tạo lớp học:

public class MyEventArgs : EventArgs 
{ 
    public MyEventArgs(params object[] args) 
    { 
     Args = args; 
    } 

    public object[] Args { get; set; } 
} 

Và sự kiện:

public event EventHandler<MyEventArgs> Bar2; 

Vì vậy, bạn sẽ cháy sự kiện như thế này:

Bar2(this, new MyEventArgs(1, "")); 
+0

Cảm ơn câu trả lời của bạn, nó tóm tắt mọi thứ tôi đang tìm kiếm khá tốt. –

4

Bạn có thể xác định một đại biểu như vậy:

public delegate void MyHandler(object p1, object p2, object p3); 

và sau đó sử dụng nó trong định nghĩa sự kiện của bạn:

public event MyHandler MyEvent; 

Tuy nhiên, điều này là trái với thông lệ tốt nhất và không được khuyến khích. Thay vào đó, bạn nên đóng gói tất cả các thông tin thêm bạn cần vào EventArgs lớp con của riêng bạn và sử dụng từ đại biểu của bạn:

public class MyEventArgs : EventArgs 
{ 
    // any extra info you need can be defined as properties in this class 
} 

public event EventHandler<MyEventArgs> MyEvent; 
+0

Cảm ơn bạn Kent. Có lẽ tôi có một chút không rõ ràng về những gì tôi thực sự muốn. Tôi muốn có thể vượt qua hoặc là một mảng của các đối tượng hoặc một số đối tượng riêng lẻ và tôi không biết có bao nhiêu đối tượng có trước. –

1

Không có gì để ngăn chặn bạn tuyên bố một đại biểu nhận vào một mảng params, giống như bạn sẽ xác định là bất kỳ phương pháp nào khác có nhiều đối số:

delegate void someCustomEvent(params object[] args); 

event someCustomEvent sce; 

Tuy nhiên, sẽ không bình thường. Như Kent nói, nó là bình thường hơn để làm theo các quy ước trên nền tảng .Net có xử lý sự kiện chấp nhận hai đối số, người gửi (đối tượng), và các đối số sự kiện (EventArgs, hoặc một cái gì đó xuất phát từ nó).

Các vấn đề liên quan