2013-04-02 49 views
13

Tôi muốn có một lớp học mà sẽ thực hiện bất kỳ phương pháp bên ngoài, như thế này:ủy nhiệm cho bất kỳ loại phương pháp - C#

class CrazyClass 
{ 
    //other stuff 

    public AnyReturnType Execute(AnyKindOfMethod Method, object[] ParametersForMethod) 
    { 
    //more stuff 
    return Method(ParametersForMethod) //or something like that 
    } 
} 

Đây có phải là có thể? Có một đại biểu nhận bất kỳ chữ ký phương pháp nào không?

+1

Làm thế nào bạn sẽ biết những gì các thông số để vượt qua nó? Điều gì sẽ xảy ra nếu bạn đoán sai về số lượng và loại tham số? – Servy

Trả lời

26

Bạn có thể làm điều này một cách khác nhau bởi Func<T> và đóng cửa:

public T Execute<T>(Func<T> method) 
{ 
    // stuff 
    return method(); 
} 

Người gọi sau đó có thể sử dụng đóng cửa để thực hiện nó:

var result = yourClassInstance.Execute(() => SomeMethod(arg1, arg2, arg3)); 

Ưu điểm ở đây là bạn cho phép trình biên dịch để làm công việc khó khăn cho bạn, và các cuộc gọi phương thức và giá trị trả về đều an toàn, cung cấp intellisense, v.v.

+1

Thật là .... rõ ràng. –

+0

Chúng ta có thể làm điều này trong constructor của CrazyClass? Nếu vậy, làm thế nào? – toddmo

+0

@toddmo - Bạn cần phải thực hiện CrazyClass chung nếu bạn muốn làm điều đó. –

0

Tôi nghĩ bạn nên sử dụng phản xạ tốt hơn trong trường hợp này, vì bạn sẽ nhận được chính xác những gì bạn yêu cầu trong câu hỏi - bất kỳ phương pháp (tĩnh hoặc chẳng hạn), bất kỳ thông số:

public object Execute(MethodInfo mi, object instance = null, object[] parameters = null) 
{ 
    return mi.Invoke(instance, parameters); 
} 

Đó là System.Reflection.MethodInfo lớp.

3

Kinda phụ thuộc vào lý do tại sao bạn muốn làm điều này ngay từ đầu ... Tôi sẽ làm điều này bằng cách sử dụng Func generic để CrazyClass vẫn có thể không biết gì về các tham số.

class CrazyClass 
{ 
    //other stuff 

    public T Execute<T>(Func<T> Method) 
    { 
     //more stuff 
     return Method();//or something like that 
    } 


} 

class Program 
{ 
    public static int Foo(int a, int b) 
    { 
     return a + b; 
    } 
    static void Main(string[] args) 
    { 
     CrazyClass cc = new CrazyClass(); 
     int someargs1 = 20; 
     int someargs2 = 10; 
     Func<int> method = new Func<int>(()=>Foo(someargs1,someargs2)); 
     cc.Execute(method); 
     //which begs the question why the user wouldn't just do this: 
     Foo(someargs1, someargs2); 
    } 
} 
0
public static void AnyFuncExecutor(Action a) 
{ 
    try 
    { 
     a(); 
    } 
    catch (Exception exception) 
    { 
     throw; 
    } 
} 
Các vấn đề liên quan