2011-09-09 67 views
19

Vì vậy, tôi có 2 lớp có tên A và B.Tự động gán phương thức/Phương thức như biến

A có phương thức "public void Foo()".

B có một số phương pháp khác.

Điều tôi cần là biến trong lớp B, sẽ được gán phương thức Foo() của lớp A. Biến này sau đó sẽ được "thực thi" (=> vì vậy nó nên thực thi phương thức được gán của lớp A) .

Cách thực hiện việc này?

Trả lời

7

Reed cung cấp cho bạn câu trả lời đúng. Nó cũng đáng chỉ ra rằng bạn có thể sử dụng chữ ký đại biểu khác bên cạnh hành động.

Có phiên bản chung chung như Action<T> (một arg), Action<T1, T2> (hai args), vv ... Ngoài ra nếu phương pháp của bạn có một kiểu trả về, hãy kiểm tra Func<T, TResult>.

Hoặc tất nhiên bạn có thể xác định loại đại biểu của riêng bạn.

48

Có vẻ như bạn muốn sử dụng một số delegate tại đây.

Về cơ bản, bạn có thể thêm, trong lớp học "B":

class B 
{ 
    public Action TheMethod { get; set; } 
} 

class A 
{ 
    public static void Foo() { Console.WriteLine("Foo"); } 
    public static void Bar() { Console.WriteLine("Bar"); } 
} 

Sau đó, bạn có thể thiết lập:

B b = new B(); 

b.TheMethod = A.Foo; // Assign the delegate 
b.TheMethod(); // Invoke the delegate... 

b.TheMethod = A.Bar; 
b.TheMethod(); // Invoke the delegate... 

này sẽ in ra "Foo", sau đó "Bar".

+1

+1 cho một ví dụ rõ ràng, đơn giản – JohnD

+0

thx rất nhiều điều này đang hoạt động. Tôi đã bỏ lỡ từ khóa "Hành động" :) – nr1

+1

@ nr1: Thực tế có nhiều tùy chọn ở đó - 'Hành động' sẽ cho phép bạn sử dụng một phương thức không trả về giá trị và không có tham số. Bạn có thể sử dụng 'Func ' nếu tất cả các phương thức của bạn lấy một int và trả về một chuỗi, ví dụ. –

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