2013-10-21 23 views
10

Tôi có lớp thực hiện nhiều hoạt động đọc/ghi tương tự nhưng khác nhau đối với tệp excel. Tất cả các hoạt động này được xác định trong các chức năng riêng biệt. Tất cả chúng phải được chứa trong cùng một khối mã dài (mã kiểm tra và mở một tệp, lưu, đóng, v.v.). Cách hợp lý để không phải lặp lại mã này mỗi lần là gì? Vấn đề là tôi không thể chỉ là một phương pháp chứa tất cả mã được chia sẻ trước khi tôi thực thi mã khác nhau cho mỗi phương thức vì mã đó phải được chứa trong nhiều lớp nếu, hãy thử và cho các câu lệnh của mã được chia sẻ .Vượt qua chức năng như một tham số trong vb.net?

Có thể chuyển một hàm làm tham số không, sau đó chỉ chạy hàm đó bên trong mã được chia sẻ? Hoặc là có một cách tốt hơn để xử lý này?

+0

bản sao có thể có của [Cách chuyển tên phương thức như tham số của quy trình trong VBNET] (http://stackoverflow.com/questions/8697504/how-to-pass-methodname-as-parameter-of-a-procedure- trong vbnet) – mbomb007

Trả lời

3

Bạn cũng có thể sử dụng delegate để bạn có thể chuyển chức năng/người đăng ký có chữ ký nhất định.

3

Khai báo tham số của bạn là Func(Of T) hoặc Action(Of T).

Loại nào bạn nên sử dụng tùy thuộc vào chữ ký của phương thức. Tôi có thể cung cấp cho bạn câu trả lời chính xác hơn nếu bạn đã cho chúng tôi một.

+0

Nếu tôi khai báo là Func, tôi nhận được lỗi "loại func không được xác định". Nếu tôi khai báo là Action, tôi nhận được lỗi "đối số kiểu ít cho system.action (của T)". Một số các phương pháp mà tôi sẽ vượt qua là các chức năng, một số trong số đó là subs. –

+0

Chúng phải có cùng chữ ký để sử dụng 'Func (Of T)' hoặc 'Action (Of T)'. – MarcinJuraszek

+1

Điều đó có nghĩa là gì? –

22

Tập trung vào câu hỏi thực tế:

Có thể vượt qua một chức năng như một tham số

Yes. Sử dụng AddressOf TheMethod để chuyển phương thức sang phương thức khác. Loại đối số phải là một đại biểu có chữ ký khớp với đối số của phương pháp đích. Bên trong phương thức, bạn xử lý tham số như thể nó là phương thức thực tế. Ví dụ:

Sub Foo() 
    Console.WriteLine("Foo!") 
End Sub 

Sub Bar() 
    Console.WriteLine("Bar!") 
End Sub 

Sub CallSomething(f As Action) 
    f() 
End Sub 

' … somewhere: 
CallSomething(AddressOf Foo) 
CallSomething(AddressOf Bar) 

Như tôi đã nói, loại thông số thực tế tùy thuộc vào chữ ký của phương thức bạn muốn chuyển. Sử dụng Action(Of T) hoặc Func(Of T) hoặc loại đại biểu tùy chỉnh. Tuy nhiên, trong nhiều trường hợp nó thực sự thích hợp để sử dụng một giao diện thay vì một đại biểu, có các lớp khác nhau thực hiện giao diện của bạn, và truyền các đối tượng của các lớp khác nhau vào phương thức của bạn.

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