2013-04-10 43 views
7

tôi cần để có thể vượt qua một phương pháp độc đoán đối với một số chức năng myFunction:Làm thế nào để vượt qua một phương pháp tùy ý (hoặc ủy nhiệm) làm tham số cho một hàm?

void myFunction(AnyFunc func) { ... } 

Nó nên có thể thực hiện nó với khác tĩnh, ví dụ, phương pháp công cộng hay tư nhân hoặc thậm chí các đại biểu:

myFunction(SomeClass.PublicStaticMethod); 
myFunction(SomeObject.PrivateInstanceMethod); 
myFunction(delegate(int x) { return 5*x; }); 

Phương thức đã truyền có thể có bất kỳ số tham số nào và bất kỳ loại trả về nào. Cũng có thể tìm hiểu số lượng thông số thực tế và các loại của chúng trong myFunction thông qua phản ánh. Điều gì sẽ là AnyFunc trong định nghĩa myFunction để đáp ứng các yêu cầu đó? Có thể chấp nhận có một số phiên bản quá tải của myFunction.

+0

Bạn mong đợi gì để chuyển sang phương thức nếu nó có thông số? Có vẻ như bạn nên chuyển đổi bất kỳ phương thức nào thành không có tham số/void return (hay còn gọi là 'Action') trước khi chuyển nó sang phương thức này. – Servy

+0

'myFunction' sẽ phân tích các tham số của hàm, kiểm tra chúng dựa vào một số cơ sở dữ liệu bên ngoài và gọi nó với các giá trị cần thiết hoặc thất bại nếu không tìm thấy mục nhập phù hợp trong cơ sở dữ liệu. –

+0

Đó là thiết kế * rất đáng lo ngại, trong đó bạn chủ yếu xử lý mã dưới dạng dữ liệu. Bạn nên xem xét cố gắng thiết kế lại điều này sao cho mã của bạn là tĩnh. – Servy

Trả lời

6

Loại Delegate là siêu kiểu của tất cả các loại đại biểu khác:

void myFunction(Delegate func) { ... } 

Sau đó, func.Method sẽ cung cấp cho bạn một MethodInfo đối tượng bạn có thể sử dụng để kiểm tra kiểu trả về và kiểu tham số.

Khi gọi hàm bạn sẽ phải xác định rõ ràng loại hình đại diện bạn muốn tạo:

myFunction((Func<int, int>) delegate (int x) { return 5 * x; }); 

Một số ý tưởng về những gì bạn đang cố gắng để hoàn thành ở mức cao hơn sẽ là tốt, vì điều này cách tiếp cận có thể không trở thành lý tưởng.

+0

Tôi muốn làm cho trang web cuộc gọi càng đơn giản càng tốt và ẩn các chi tiết gớm ghiếc bên trong thư viện. Bất kỳ cách nào để chỉ định 'myFunction' để người dùng không cần phải truyền các đại biểu của họ? –

+1

@SergiyByelozyorov Trang web cuộc gọi không thể được thực hiện đơn giản hơn, vì trình biên dịch cần * một số loại * đại biểu cụ thể để tạo một thể hiện. Nếu bạn muốn chấp nhận "bất kỳ loại đại biểu nào" thì người gọi * phải * chỉ định một loại đại biểu.(Ví dụ, với ủy nhiệm ẩn danh 'delegate() {}', cả ['Action'] (http://msdn.microsoft.com/en-us/library/system.action.aspx) và [' ThreadStart' ] (http://msdn.microsoft.com/en-us/library/system.threading.threadstart.aspx) là các loại đại biểu tương thích - trình biên dịch biết cái nào cần tạo?) – cdhowie

+0

Cảm ơn. Tôi đoán đó là câu trả lời của tôi rồi. Đó là không thể. Cảm ơn bạn. –

0

Có phương pháp chấp nhận một Delegate, chứ không phải là một đại biểu cụ thể:

void myFunction(Delegate func) 
{ 

} 
+0

Cũng giống như trong câu trả lời từ cdhowie, nó sẽ yêu cầu truyền đại biểu cho một loại đại biểu cụ thể hoặc Func <...>. Tôi muốn tránh điều đó. –

+0

@SergiyByelozyorov Và như ông đã nói với bạn, đó là không thể. – Servy

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