2012-05-12 83 views
6

Tôi cố gắng để xây dựng một đối tượng có sử dụng System.ComponentModel.ISynchronizeInvoke, trong đó có phương pháp: (giữa những người khác)Gọi System.Delegate đối tượng lớp trong C#

public object Invoke(Delegate method, object[] args) 

cách tốt nhất để gọi là gì phương pháp với các đối số đã cho? Tôi có thể sử dụng:

public object Invoke(Delegate method, object[] args) 
    { 
     return method.DynamicInvoke(args); 
    } 

Nhưng điều này bị trễ. Bản năng ruột của tôi là đây là cách duy nhất để gọi phương thức .. Bất kỳ ý tưởng nào?

+3

Hãy coi chừng bạn đang thực hiện các lời hứa khá cứng khi bạn triển khai giao diện. Bạn thực sự được mong đợi * đồng bộ hóa * mã. Tập trung vào việc triển khai thuộc tính InvokeRequired trước tiên, đó là điều khó khăn nhất. –

Trả lời

4

Tôi nghĩ rằng về mặt lý thuyết thì không thể nào theo cách khác. Các đại biểu method có thể đóng gói một phương pháp của bất kỳ chữ ký (với bất kỳ số lượng và loại tham số, và bất kỳ loại giá trị trả lại hoặc void). Cách duy nhất để giải quyết chữ ký của nó và gọi nó bằng các đối số được cung cấp (sau khi xác minh rằng chúng có số lượng và loại chính xác) sẽ ở thời gian chạy thông qua sự phản chiếu.

Nếu bạn không triển khai giao diện ISynchronizeInvoke và có thể xác định phương thức của riêng mình, thì bạn có thể giới hạn đối số method để chỉ chấp nhận phương thức đại biểu của chữ ký cụ thể; trong trường hợp đó, bạn có thể gọi chúng trực tiếp.

Ví dụ, để thực hiện phương pháp mà không chứa tham số và có một giá trị trả về, bạn sẽ sử dụng:

public TResult Invoke<TResult>(Func<TResult> method) 
{ 
    return method(); 
} 

Để thực hiện một phương pháp mà có ba thông số và không có giá trị trả về, bạn sẽ sử dụng:

public void Invoke<T1,T2,T3>(Action<T1,T2,T3> method, T1 arg1, T2 arg2, T3 arg3) 
{ 
    method(arg1, arg2, arg3); 
} 
+0

Sau khi đào sâu hơn một chút, vâng, đây là kết luận tôi cũng đã đến. Cảm ơn phản ứng ngắn gọn. – Rob

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