Delegate.GetInvocationList Metodo

Definizione

Restituisce l'elenco chiamate del delegato.

public:
 virtual cli::array <Delegate ^> ^ GetInvocationList();
public virtual Delegate[] GetInvocationList();
abstract member GetInvocationList : unit -> Delegate[]
override this.GetInvocationList : unit -> Delegate[]
Public Overridable Function GetInvocationList () As Delegate()

Valori restituiti

Matrice di delegati che rappresentano l'elenco chiamate del delegato corrente.

Esempio

Nell'esempio seguente vengono assegnati tre metodi a un delegato. Chiama quindi il GetInvocationList metodo per ottenere un conteggio totale dei metodi assegnati al delegato, per eseguire i delegati in ordine inverso e per eseguire i metodi il cui nome non include la sottostringa "File".

using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;

public class Example
{
   public static void Main()
   {
      Action<String> outputMessage = null;
      outputMessage += Console.WriteLine;
      outputMessage += OutputToFile;
      outputMessage += ShowMessageBox;

//       Dim output1 As Action(Of String) = AddressOf Console.WriteLine
//       Dim output2 As Action(Of String) = AddressOf OutputToFile
//       Dim output3 As Action(Of String) = AddressOf MessageBox.Show
//
//       outputMessage = [Delegate].Combine( { output1, output2, output3 } )
      Console.WriteLine("Invocation list has {0} methods.",
                        outputMessage.GetInvocationList().Length);

      // Invoke delegates normally.
      outputMessage("Hello there!");
      Console.WriteLine("Press <Enter> to continue...");
      Console.ReadLine();

      // Invoke each delegate in the invocation list in reverse order.
      for (int ctr = outputMessage.GetInvocationList().Length - 1; ctr >= 0; ctr--) {
         var outputMsg = outputMessage.GetInvocationList()[ctr];
         outputMsg.DynamicInvoke("Greetings and salutations!");
      }
      Console.WriteLine("Press <Enter> to continue...");
      Console.ReadLine();

      // Invoke each delegate that doesn't write to a file.
      for (int ctr = 0; ctr < outputMessage.GetInvocationList().Length; ctr++) {
         var outputMsg = outputMessage.GetInvocationList()[ctr];
         if (!outputMsg.GetMethodInfo().Name.Contains("File"))
            outputMsg.DynamicInvoke( new String[] { "Hi!" } );
      }
   }

   private static void OutputToFile(String s)
   {
      var sw = new StreamWriter(@".\output.txt");
      sw.WriteLine(s);
      sw.Close();
   }

   private static void ShowMessageBox(String s)
   {
      MessageBox.Show(s);
   }
}
open System
open System.IO
open System.Reflection
open System.Windows.Forms

let outputToFile (s: string) =
    use sw = new StreamWriter(@".\output.txt")
    sw.WriteLine s

let showMessageBox s =
    MessageBox.Show s |> ignore

let outputMessage =
    Delegate.Combine(
        Action<string>(Console.WriteLine),
        Action<string>(outputToFile),
        Action<string>(showMessageBox))
    :?> Action<string>

printfn $"Invocation list has {outputMessage.GetInvocationList().Length} methods."

// Invoke delegates normally.
outputMessage.Invoke "Hello there!"
printfn "Press <Enter> to continue..."
stdin.ReadLine() |> ignore

// Invoke each delegate in the invocation list in reverse order.
for i = outputMessage.GetInvocationList().Length - 1 downto 0 do
    let outputMsg = outputMessage.GetInvocationList()[i]
    outputMsg.DynamicInvoke "Greetings and salutations!"
    |> ignore

printfn "Press <Enter> to continue..."
stdin.ReadLine() |> ignore

// Invoke each delegate that doesn't write to a file.
for i = 0 to outputMessage.GetInvocationList().Length - 1 do
    let outputMsg = outputMessage.GetInvocationList()[i]
    if not (outputMsg.GetMethodInfo().Name.Contains "File") then
        outputMsg.DynamicInvoke "Hi!"
        |> ignore
Imports System.IO
Imports System.Reflection
Imports System.Windows.Forms

Module Example
   Public outputMessage As Action(Of String)
   
   Public Sub Main()
      Dim output1 As Action(Of String) = AddressOf Console.WriteLine
      Dim output2 As Action(Of String) = AddressOf OutputToFile 
      Dim output3 As Action(Of String) = AddressOf MessageBox.Show
      
      outputMessage = [Delegate].Combine( { output1, output2, output3 } )
      Console.WriteLine("Invocation list has {0} methods.", 
                        outputMessage.GetInvocationList().Count)

      ' Invoke delegates normally.
      outputMessage("Hello there!")
      Console.WriteLine("Press <Enter> to continue...")
      Console.ReadLine()
      
      ' Invoke each delegate in the invocation list in reverse order.
      For ctr As Integer = outputMessage.GetInvocationList().Count - 1 To 0 Step -1
          Dim outputMsg = outputMessage.GetInvocationList(ctr)
          outputMsg.DynamicInvoke("Greetings and salutations!")
      Next
      Console.WriteLine("Press <Enter> to continue...")
      Console.ReadLine()
      
      ' Invoke each delegate that doesn't write to a file.
      For ctr As Integer = 0 To outputMessage.GetInvocationList().Count - 1 
         Dim outputMsg = outputMessage.GetInvocationList(ctr)
         If Not outputMsg.GetMethodInfo().Name.Contains("File") Then
            outputMsg.DynamicInvoke( { "Hi!" } )
         End If
      Next
   End Sub
   
   Private Sub OutputToFile(s As String)
      Dim sw As New StreamWriter(".\output.txt")
      sw.WriteLine(s)
      sw.Close()
   End Sub
End Module

Commenti

Ogni delegato nella matrice rappresenta esattamente un metodo.

L'ordine dei delegati nella matrice è lo stesso ordine in cui il delegato corrente richiama i metodi rappresentati da tali delegati.

Si applica a