Helpex - Trao đổi & giúp đỡ Đăng nhập
34

Tôi đang kết nối một sự kiện để sử dụng lambda cần phải xóa chính nó sau khi kích hoạt. Tôi không thể làm điều đó bằng cách nội dòng lambda đến sự kiện + = (không có biến có thể truy cập để sử dụng để xóa sự kiện) vì vậy tôi đã thiết lập một Action<object, EventArgs>biến và di chuyển lambda đến đó. Lỗi chính là nó không thể chuyển đổi Action<object, EventArgs>một EventHandler. Tôi nghĩ rằng các biểu thức lambda có thể chuyển đổi ngầm thành các trình xử lý sự kiện, tại sao điều này không hoạt động?

34 hữu ích 0 bình luận 11k xem chia sẻ
44

Lambdas có thể chuyển đổi hoàn toàn thành các loại đại biểu có hình dạng phù hợp, nhưng hai loại đại biểu có hình dạng giống nhau không hoàn toàn có thể chuyển đổi cho nhau. Thay vào đó, chỉ cần đặt biến cục bộ có kiểu EventHandler.

EventHandler h = (o, ea) => { ... };
e += h;
...
e -= h;

(trong trường hợp nó giúp:

Action<object, EventArgs> a = (o, ea) => { }; 
EventHandler e = a;  // not allowed
EventHandler e2 = (o,ea) => a(o,ea);  // ok

)

44 hữu ích 5 bình luận chia sẻ
48
Action<Object, EventArgs> a = (o, ea) => { };
EventHandler e = a.Invoke;
48 hữu ích 2 bình luận chia sẻ
3

Khai báo sự kiện của bạn là

public event Action<object, EventArgs> e;

Sau đó, bạn có thể trực tiếp thêm hành động của mình:

Action<object, EventArgs> a = something;
e += a;
3 hữu ích 0 bình luận chia sẻ
2

Nói chung, các đại biểu không thể được ép kiểu vì chúng không có cây kế thừa xác định các phôi nào là hợp lệ. Để kết thúc, bạn có hai lựa chọn:

  1. Sử dụng một biến loại EventHandlerthay vìAction<T1, T2>
  2. Sử dụng một khai báo nội tuyến.

    // option 1: local variable
    EventHandler eh = (o, ea) => { /* [snip] */ };
    obj.event += eh;
    obj.event -= eh;
    
    // option 2: inline declaration
    obj.event += (o, ea) => { /* [snip] */ };
    
2 hữu ích 1 bình luận chia sẻ
-1

Thay vào đó, bạn có thể sử dụng phương pháp ẩn danh:

Event += (sender, e) =>
{
     // Multiple lines
     // of code here
};
-1 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ c# .net event-handling casting , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading