Delegate.GetInvocationList Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает список вызовов делегата.
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()
Возвращаемое значение
Массив делегатов, представляющих список вызовов текущего делегата.
Примеры
В следующем примере делегату назначается три метода. Затем он вызывает GetInvocationList метод , чтобы получить общее количество методов, назначенных делегату, для выполнения делегатов в обратном порядке и для выполнения методов, имя которых не включает подстроку "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
Комментарии
Каждый делегат в массиве представляет ровно один метод.
Порядок делегатов в массиве совпадает с порядком, в котором текущий делегат вызывает методы, представляемые этими делегатами.