2009-07-19 15 views
8

Trước hết, tôi đang sử dụng VS2005 và C# 2.0.C# 2.0 generics: Cách tạo đối tượng Action với tham số 0

Tôi đang cố gắng đặt hộp tổ hợp 'Thuộc tính văn bản từ bên trong sự kiện SelectedIndexChanged. Từ thread khác ở đây trên StackOverflow này đã được đề xuất thực hiện theo cách sau:

BeginInvoke(new Action(() => someCombobox.Text = "x")); 

Bây giờ, trước hết này trả về một lỗi biên dịch cho tôi. Tôi tin rằng đó là vì đối tượng Hành động hoạt động khác nhau trong hai đặc tả ngôn ngữ. Trong C# 2.0, đối tượng Action dường như cần cấu trúc <T> trong tất cả các khai báo. Có lẽ tôi sai, nhưng tôi muốn làm rõ điều đó.

gì làm việc như sau:

BeginInvoke(new Action<string>(delegate { someCombobox.Text = "x"; }), new object[] { "" }); 

Tuy nhiên, nó chỉ có vẻ rất lạ với tôi rằng tôi phải xác định các đối tượng hành động với một số loại (đặc biệt là kể từ khi tôi không có ý định vượt qua bất kỳ thông số nào)! Bằng cách nào đó loại bỏ tham số này cũng sẽ làm cho đối tượng rỗng mới [] lỗi thời, đó là những gì tôi muốn.

Có ai có thể giúp tôi đơn giản hóa cuộc gọi ở trên không?

Cuối cùng, có đảm bảo rằng BeginInvoke sẽ kết thúc sau khi SelectedIndexChanged và do đó cập nhật thuộc tính Văn bản của hộp kết hợp với văn bản chính xác không?

Tôi thực sự đánh giá cao việc tìm hiểu câu trả lời cho những câu hỏi này.

+0

Lỗi biên dịch là do biểu thức lambda. Lambda là mới trong C# 3.0, và là một hình thức ngắn của cú pháp tạo đại biểu. –

Trả lời

9

Tôi không nghĩ rằng Hành động không có thông số có sẵn trong .NET 2.0 Không phải lo lắng - chỉ cần sử dụng loại đại biểu được xác định trước khác. MethodInvoker nên thực hiện công việc (phương thức void không có tham số).

Ngoài ra, BeginInvoke có 2 tình trạng quá tải - một quá trình cần một đại biểu và một trong đó có một đại biểu và một mảng các đối tượng.

BeginInvoke(new MethodInvoker(delegate() 
{ 
    someCombobox.Text = "x"; 
})); 
+0

Tôi đã sử dụng 'MethodInvoker' nhiều lần trước khi' System.Action' xuất hiện. :) –

9

Bạn có thể xác định đại biểu Hành động của riêng mình.

delegate void Action()

Tôi không thể nhìn thấy đối tượng mà bạn đang gọi BeginInvoke, nhưng nếu nó là một điều khiển giao diện người dùng tạo ra trên thread giống như combobox, các đại biểu bạn vượt qua được đảm bảo để được viện dẫn một số thời gian sau khi trình xử lý sự kiện SelectedIndexChanged hoàn tất.

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