2009-05-14 41 views
13

Có cách nào để tôi có thể tạo loại đại biểu mới dựa trên loại hiện có không? Trong trường hợp của tôi, tôi muốn tạo một đại biểu MyMouseEventDelegate có chức năng giống như EventHandler<MouseEventArgs>.Làm cách nào để tạo loại đại biểu mới dựa trên loại hiện có, trong C#?

Tại sao tôi muốn điều này? Để tận dụng lợi thế của kiểm tra loại biên dịch theo thời gian, tất nhiên! Bằng cách này, tôi có thể có hai đại biểu khác nhau: MyRightClickHandlerMyLeftClickHandler và không bao giờ bị nhầm lẫn hai lần - ngay cả khi cả hai chức năng giống hệt nhau với EventHandler<MouseEventArgs>.

Có cú pháp nào để thực hiện việc này không?

Oh, và mã như:

using MyRightClickHandler = EventHandler<MouseEventArgs> 

là không đủ tốt. Nó không thực hiện bất kỳ kiểm tra kiểu nào vì nó không thực sự tạo ra một kiểu mới. Và tôi phải dán một dòng như vậy vào mọi tệp mã mà tôi sẽ tham chiếu đến MyRightClickHandler.

+1

Tôi đã sửa đổi tiêu đề để làm rõ rằng bạn đang nói về các loại đại biểu, chứ không phải đại diện cho các đại biểu. Hy vọng bạn không nhớ. –

+0

Được vinh danh! Cảm ơn. – scraimer

Trả lời

10

Vâng, nó đơn giản như sao chép khai báo ủy nhiệm từ bản gốc. Không có gì trong C# để làm điều này tự động là, nhưng tôi không thể nhìn thấy nó là nhiều của một gánh nặng:

public delegate void MyLeftClickHandler(object sender, MouseEventArgs e); 
public delegate void MyRightClickHandler(object sender, MouseEventArgs e); 

Nó không giống như MouseEventHandler sẽ thay đổi bất cứ lúc nào sớm ...

Bạn đã thực sự được bị cắn bởi lỗi do sử dụng sai đại biểu ở những nơi sai? Tôi không thể nhớ chính mình đã từng gặp vấn đề gì, và có vẻ như tôi đang giới thiệu nhiều công việc hơn (và một nhóm đại biểu không quen thuộc với các nhà phát triển khác) - bạn có chắc nó đáng giá không?

+0

Chà. Tôi đoán tôi nên suy nghĩ và sử dụng tốt hơn thông thường cảm giác thời gian tiếp theo :-) – scraimer

+0

Nó không phải là một gánh nặng nhưng nó không cho phép polymophism trên đại biểu. –

5

Tôi chỉ muốn kiểm tra kiểu thời gian biên dịch, tôi đoán sẽ đủ để tạo các lớp EventArgs chuyên biệt cho các trường hợp bạn mô tả. Bằng cách đó bạn vẫn có thể tận dụng lợi thế của các đại biểu được xác định trước:

class RightMouseButtonEventArgs : MouseEventArgs {} 
class LeftMouseButtonEventArgs : MouseEventArgs {} 

EventHandler<RightMouseButtonEventArgs> 
EventHandler<LeftMouseButtonEventArgs> 
4

số Theo C# documentation, các loại đại biểu được niêm phong, và bạn không thể tạo ra một loại đại biểu mới được thừa kế từ mẫu có sẵn.

3

Tôi không tin jon-skeet. Tôi phải tự mình thử nó. Anh ấy đã đúng.

public void F(object sender, MouseEventArgs e) {}; 
public MyLeftClickHandler l; 
public MyRightClickHandler r; 
public void Test() 
{ 
    l = F; // Automatically converted. 
    r = F; // Automatically converted to a different type. 
    l = r; // Syntax error. Incompatible types. 
    l = new MyLeftClickHandler(r); // Explicit conversion works. 
} 

Điều đó không hiển nhiên!

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