2010-05-24 33 views
5

Tôi vừa triển khai Clone từ ICloneable và nhận ra rằng các đăng ký sự kiện từ cá thể nguồn của tôi cũng được theo sau. Có cách nào tốt để xóa tất cả những thứ đó không?Xóa tất cả đăng ký sự kiện (Clone linked)

Hiện tại tôi đang sử dụng một vài vòng lặp này cho mọi sự kiện tôi phải xóa mọi thứ.

foreach (var eventhandler in OnIdChanged.GetInvocationList()) 
{ 
    OnIdChanged -= (ItemEventHandler) eventhandler; 
} 

foreach (var eventhandler in OnNameChanged.GetInvocationList()) 
{ 
    ... 

Điều này làm việc tốt nhưng cắt bớt mã một chút. Hầu hết lo lắng để có được sự kiện lơ lửng.

Trả lời

1

Tôi nghĩ bạn chỉ có thể đặt OnIdChanged = null trong đối tượng được nhân bản của mình.

Sau khi bạn đã tạo bản sao, bạn chỉ cần gọi phương thức ClearEvents trên bản sao.

public class ClonedObject 
{ 
    public event EventHandler OnIdChanged; 
    public event EventHandler OnNameChanged; 

    public void ClearEvents() 
    { 
     OnIdChanged = null; 
     OnNameChanged = null; 
    } 
} 
+0

điều này đã hoạt động nên tôi đang đánh dấu là một câu trả lời. mặc dù tôi đang xem xét tái cấu trúc sau khi câu trả lời từ Randolpho – mattias

+1

@mattias, tôi chỉ xem xét câu hỏi của bạn chứ không phải là ý nghĩa của giải pháp của bạn trong câu trả lời của tôi. Điều Randolpho gợi ý có lẽ tốt hơn. –

+0

nó vẫn giúp trong ngắn hạn. cảm ơn! – mattias

2

Có lẽ, nếu bạn thực sự muốn sao chép một đối tượng, bạn muốn giữ những đăng ký sự kiện.

Nếu bạn nhân bản các đối tượng không được đăng ký với các sự kiện, có vẻ như bạn nên xem xét sắp xếp lại mã của mình. Yêu cầu bộ điều khiển hoặc các đối tượng tương tự của bạn đăng ký các sự kiện với tham chiếu đến một đối tượng dữ liệu chuyên dụng và để đối tượng dữ liệu của bạn lưu trữ dữ liệu đó mà không tham chiếu đến các sự kiện; sao chép các đối tượng dữ liệu và đặt chúng vào các đối tượng điều khiển thích hợp khi cần thiết.

Cuối cùng, tôi đề nghị bạn giải quyết vấn đề bằng cách không đăng ký các sự kiện mà bạn không cần phải đăng ký. Nhìn vào không gian vấn đề từ một góc độ khác.

+1

Tôi nghĩ điều tương tự khi tôi đọc câu hỏi. Clone() ngụ ý bạn đang thực sự nhân bản đối tượng, sự kiện và tất cả. –

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