2008-10-31 33 views
9

Tôi đang thử nghiệm bằng cách gọi hàm đại biểu từ một mảng đại biểu. Tôi đã có thể tạo ra các mảng đại biểu, nhưng làm thế nào để tôi gọi cho đại biểu?Delegate Array

public delegate void pd(); 

public static class MyClass 
{ 

    static void p1() 
    { 
     //... 
    } 

    static void p2() 
    { 
     //... 
    } 

    //... 

    static pd[] delegates = new pd[] { 

     new pd(MyClass.p1), 
     new pd(MyClass.p2) 
     /* ... */ 
    }; 
} 

public class MainClass 
{ 
    static void Main() 
    { 
     // Call pd[0] 
     // Call pd[1] 
    } 
} 

EDIT: Lý do cho mảng là tôi cần phải gọi các chức năng đại diện bởi một chỉ số khi cần thiết. Chúng không chạy để đáp ứng với một sự kiện. Tôi thấy một lỗi nghiêm trọng (ngu ngốc) trong mã của tôi như tôi đã cố gắng thực hiện các chức năng đại biểu bằng cách sử dụng pd [] loại chứ không phải là tên của mảng (đại biểu).

Trả lời

14

Nếu chúng cùng loại, tại sao không chỉ kết hợp chúng thành một đại biểu đa hướng?

static pd delegateInstance = new pd(MyClass.p1) + new pd(MyClass.p2) ...; 

... 
pd(); 
+0

Một lý do không phải là xử lý riêng các trường hợp ngoại lệ do bất kỳ đại biểu nào ném ra, thay vì chỉ bắt đầu những người đầu tiên. –

+0

Theo chỉnh sửa của tôi, các đại biểu không được thực hiện để đáp ứng với một sự kiện, nhưng được gọi riêng lẻ bằng cách sử dụng một chỉ mục trong mảng. – pro3carp3

+0

@jacob_c - vâng, nếu bạn thực sự muốn :) @ pro3carp3 - trong trường hợp đó bạn chỉ cần truy cập nó theo chỉ mục như bình thường cho một mảng. Không có gì đặc biệt về việc nó là một đại biểu ở đây. –

7
public class MainClass 
{ 
    static void Main() 
    { 
     pd[0](); 
     pd[1](); 
    } 
} 
+0

Về mặt kỹ thuật, mà cần được MyClass.pd [0](). pd là một loại, và MyClass.pd là thành viên tĩnh của MyClass. –

+0

Tại sao bạn không kết hợp les PD với nhau! –

7

Trong .Net, bất kỳ đại biểu nào thực sự là đại diện "multicast" (kế thừa từ lớp cơ sở có sẵn này), và do đó chứa danh sách liên kết nội bộ có thể chứa số lượng đại biểu đích.

Bạn có thể truy cập danh sách này bằng cách gọi phương thức GetInvocationList() trên chính ủy nhiệm đó. Phương thức này trả về một mảng các đại biểu ...

Hạn chế duy nhất là tất cả các đại biểu bên trong danh sách liên kết của một đại biểu nhất định phải có chữ ký giống nhau (có cùng loại đại biểu). Nếu bạn cần bộ sưu tập của bạn để có thể chứa các đại biểu của các loại khác nhau, sau đó bạn cần phải xây dựng danh sách của riêng bạn hoặc lớp sưu tập.

Nhưng nếu điều này là ok, sau đó bạn có thể "gọi" các đại biểu trong danh sách gọi một đại biểu cho trước như thế này:

public delegate void MessageArrivedHandler(MessageBase msg); 
public class MyClass 
{ 
    public event MessageArrivedHandler MessageArrivedClientHandler; 

    public void CallEachDelegate(MessageBase msg) 
    { 
      if (MessageArrivedClientHandler == null) 
       return; 
      Delegate[] clientList = MessageArrivedClientHandler.GetInvocationList(); 
      foreach (Delegate d in clientList) 
      { 
       if (d is MessageArrivedHandler) 
        (d as MessageArrivedHandler)(msg); 
      } 
    } 
} 
3
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     pd[0](); 
     pd[1](); 
    } 

    public delegate void delegates(); 

    static delegates[] pd = new delegates[] 
          { 
           new delegates(MyClass.p1), 
           new delegates(MyClass.p2) 
          }; 

    public static class MyClass 
    { 
     public static void p1() 
     { 
      MessageBox.Show("1"); 
     } 

     public static void p2() 
     { 
      MessageBox.Show("2"); 
     } 
    } 
} 
+0

"Đại biểu" không phải là "đại biểu" –

0
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     pd[0](1); 
     pd[1](2); 
    } 

    public delegate void delegates(int par); 
    static delegates[] pd = new delegates[] 
            { 
             new delegates(MyClass.p1), 
             new delegates(MyClass.p2) 
            }; 
    public static class MyClass 
    { 

     public static void p1(int par) 
     { 
      MessageBox.Show(par.ToString()); 
     } 

     public static void p2(int par) 
     { 
      MessageBox.Show(par.ToString()); 
     } 


    } 

}