Delegate.GetInvocationList Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Returnerar anropslistan för ombudet.
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()
Returer
En matris med ombud som representerar anropslistan för det aktuella ombudet.
Exempel
I följande exempel tilldelas tre metoder till ett ombud. Den anropar GetInvocationList sedan metoden för att få ett totalt antal metoder som tilldelats ombudet, köra ombuden i omvänd ordning och för att köra de metoder vars namn inte innehåller delsträngen "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
Kommentarer
Varje ombud i matrisen representerar exakt en metod.
Ordningen på ombuden i matrisen är i samma ordning som den aktuella delegaten anropar de metoder som ombuden representerar.