MulticastDelegate Clase

Definición

Representa un delegado de multidifusión; es decir, un delegado que puede tener más de un elemento en su lista de invocación.

public ref class MulticastDelegate abstract : Delegate
public abstract class MulticastDelegate : Delegate
[System.Serializable]
public abstract class MulticastDelegate : Delegate
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class MulticastDelegate : Delegate
type MulticastDelegate = class
    inherit Delegate
[<System.Serializable>]
type MulticastDelegate = class
    inherit Delegate
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type MulticastDelegate = class
    inherit Delegate
Public MustInherit Class MulticastDelegate
Inherits Delegate
Herencia
MulticastDelegate
Atributos

Ejemplos

En el ejemplo siguiente se define una clase, StringContainer, que incluye una colección de cadenas. Uno de sus miembros es el delegado de CheckAndDisplayDelegate, que se usa para mostrar cadenas almacenadas en un objeto StringContainer que cumple determinados criterios. El delegado toma una sola cadena como parámetro y devuelve void (o, en Visual Basic, es un procedimiento Sub). También incluye un método, DisplayAllQualified, que tiene un único parámetro, un delegado CheckAndDisplayDelegate. Esto permite llamar al método y mostrar un conjunto de cadenas filtradas en función de los métodos que contiene el delegado.

En el ejemplo también se define una clase de utilidad, StringExtensions, que tiene dos métodos:

  • ConStart, que muestra cadenas que comienzan con un consonante.

  • VowelStart, que muestra cadenas que comienzan con una vocal.

Tenga en cuenta que ambos métodos incluyen un único parámetro de cadena y devuelven void. Es decir, ambos métodos se pueden asignar al delegado CheckAndDisplayDelegate.

El método Test.Main es el punto de entrada de la aplicación. Crea una instancia de un objeto StringContainer, lo rellena con cadenas y crea dos delegados CheckAndDisplayDelegate, conStart y vowelStart, que invocan un único método. A continuación, llama al método Delegate.Combine para crear el delegado de multipleDelegates, que inicialmente contiene los delegados ConStart y VowelStart. Tenga en cuenta que cuando se invoca el delegado multipleDelegates, muestra todas las cadenas de la colección en su orden original. Esto se debe a que cada letra se pasa por separado a cada delegado y cada letra cumple los criterios de filtrado de solo uno de los dos delegados. Por último, después de las llamadas a Delegate.Remove y Delegate.Combine, multipleDelegates contiene dos delegados conStart. Cuando se invoca, cada cadena del objeto StringContainer se muestra dos veces.

using namespace System;
using namespace System::Collections::Generic;

ref class StringContainer
{
private:
   // A generic list object that holds the strings.
   List<String^>^ container = gcnew List<String^>;

public:
   // Define a delegate to handle string display.
   delegate void CheckAndDisplayDelegate(String^ str);

   // A method that adds more strings to the collection.
   void AddString(String^ str)
   {
      container->Add(str);
   }

   // Iterate through the strings and invoke the method(s) that the delegate points to.
   void DisplayAllQualified(CheckAndDisplayDelegate^ displayDelegate)
   {
      for each (String^ str in container)
         displayDelegate(str);
//       System::Collections::IEnumerator^ myEnum = container->GetEnumerator();
//       while ( myEnum->MoveNext() )
//       {
//          String^ str = safe_cast<String^>(myEnum->Current);
//          displayDelegate(str);
//      }
   }
};

//end of class StringContainer
// This class contains a few sample methods
ref class StringFuncs
{
public:

   // This method prints a String* that it is passed if the String* starts with a vowel
   static void ConStart(String^ str)
   {
      if (  !(str[ 0 ] == 'a' || str[ 0 ] == 'e' || str[ 0 ] == 'i' || str[ 0 ] == 'o' || str[ 0 ] == 'u') )
            Console::WriteLine( str );
   }

   // This method prints a String* that it is passed if the String* starts with a consonant
   static void VowelStart( String^ str )
   {
      if ( (str[ 0 ] == 'a' || str[ 0 ] == 'e' || str[ 0 ] == 'i' || str[ 0 ] == 'o' || str[ 0 ] == 'u') )
            Console::WriteLine( str );
   }
};

// This function demonstrates using Delegates, including using the Remove and
// Combine methods to create and modify delegate combinations.
int main()
{
   // Declare the StringContainer class and add some strings
   StringContainer^ container = gcnew StringContainer;
   container->AddString( "This" );
   container->AddString( "is" );
   container->AddString( "a" );
   container->AddString( "multicast" );
   container->AddString( "delegate" );
   container->AddString( "example" );

// RETURN HERE.
   // Create two delegates individually using different methods
   StringContainer::CheckAndDisplayDelegate^ conStart = gcnew StringContainer::CheckAndDisplayDelegate( StringFuncs::ConStart );
   StringContainer::CheckAndDisplayDelegate^ vowelStart = gcnew StringContainer::CheckAndDisplayDelegate( StringFuncs::VowelStart );

   // Get the list of all delegates assigned to this MulticastDelegate instance. 
   array<Delegate^>^ delegateList = conStart->GetInvocationList();
   Console::WriteLine("conStart contains {0} delegate(s).", delegateList->Length);
   delegateList = vowelStart->GetInvocationList();
   Console::WriteLine("vowelStart contains {0} delegate(s).\n", delegateList->Length );

   // Determine whether the delegates are System::Multicast delegates
   if ( dynamic_cast<System::MulticastDelegate^>(conStart) && dynamic_cast<System::MulticastDelegate^>(vowelStart) )
   {
      Console::WriteLine("conStart and vowelStart are derived from MulticastDelegate.\n");
   }

   // Execute the two delegates.
   Console::WriteLine("Executing the conStart delegate:" );
   container->DisplayAllQualified(conStart);
   Console::WriteLine();
   Console::WriteLine("Executing the vowelStart delegate:" );
   container->DisplayAllQualified(vowelStart);

   // Create a new MulticastDelegate and call Combine to add two delegates.
   StringContainer::CheckAndDisplayDelegate^ multipleDelegates =
           dynamic_cast<StringContainer::CheckAndDisplayDelegate^>(Delegate::Combine(conStart, vowelStart));

   // How many delegates does multipleDelegates contain?
   delegateList = multipleDelegates->GetInvocationList();
   Console::WriteLine("\nmultipleDelegates contains {0} delegates.\n", 
                      delegateList->Length );

   //       // Pass this multicast delegate to DisplayAllQualified.
   Console::WriteLine("Executing the multipleDelegate delegate.");
   container->DisplayAllQualified(multipleDelegates);
   // Call remove and combine to change the contained delegates.
   multipleDelegates = dynamic_cast<StringContainer::CheckAndDisplayDelegate^>
                      (Delegate::Remove(multipleDelegates, vowelStart));
   multipleDelegates = dynamic_cast<StringContainer::CheckAndDisplayDelegate^>
                      (Delegate::Combine(multipleDelegates, conStart));

   // Pass multipleDelegates to DisplayAllQualified again.
   Console::WriteLine("\nExecuting the multipleDelegate delegate with two conStart delegates:");
   container->DisplayAllQualified(multipleDelegates);
} 
// The example displays the following output:
//    conStart contains 1 delegate(s).
//    vowelStart contains 1 delegate(s).
//    
//    conStart and vowelStart are derived from MulticastDelegate.
//    
//    Executing the conStart delegate:
//    This
//    multicast
//    delegate
//    
//    Executing the vowelStart delegate:
//    is
//    a
//    example
//    
//    
//    multipleDelegates contains 2 delegates.
//    
//    Executing the multipleDelegate delegate.
//    This
//    is
//    a
//    multicast
//    delegate
//    example
//    
//    Executing the multipleDelegate delegate with two conStart delegates:
//    This
//    This
//    multicast
//    multicast
//    delegate
//    delegate
using System;
using System.Collections.Generic;

class StringContainer
{
   // Define a delegate to handle string display.
   public delegate void CheckAndDisplayDelegate(string str);

   // A generic list object that holds the strings.
   private List<String> container = new List<String>();

   // A method that adds strings to the collection.
   public void AddString(string str)
   {
      container.Add(str);
   }

   // Iterate through the strings and invoke the method(s) that the delegate points to.
   public void DisplayAllQualified(CheckAndDisplayDelegate displayDelegate)
   {
      foreach (var str in container) {
         displayDelegate(str);
      }
   }
 }

// This class defines some methods to display strings.
class StringExtensions
{
   // Display a string if it starts with a consonant.
   public static void ConStart(string str)
   {
      if (!(str[0]=='a'||str[0]=='e'||str[0]=='i'||str[0]=='o'||str[0]=='u'))
          Console.WriteLine(str);
   }

   // Display a string if it starts with a vowel.
   public static void VowelStart(string str)
   {
      if ((str[0]=='a'||str[0]=='e'||str[0]=='i'||str[0]=='o'||str[0]=='u'))
          Console.WriteLine(str);
   }
}

// Demonstrate the use of delegates, including the Remove and
// Combine methods to create and modify delegate combinations.
class Test
{
   static public void Main()
   {
      // Declare the StringContainer class and add some strings
      StringContainer container = new StringContainer();
      container.AddString("This");
      container.AddString("is");
      container.AddString("a");
      container.AddString("multicast");
      container.AddString("delegate");
      container.AddString("example");

      // Create two delegates individually using different methods.
      StringContainer.CheckAndDisplayDelegate conStart = StringExtensions.ConStart;
      StringContainer.CheckAndDisplayDelegate vowelStart = StringExtensions.VowelStart;

      // Get the list of all delegates assigned to this MulticastDelegate instance.
      Delegate[] delegateList = conStart.GetInvocationList();
      Console.WriteLine("conStart contains {0} delegate(s).", delegateList.Length);
      delegateList = vowelStart.GetInvocationList();
      Console.WriteLine("vowelStart contains {0} delegate(s).\n", delegateList.Length);

      // Determine whether the delegates are System.Multicast delegates.
      if (conStart is System.MulticastDelegate && vowelStart is System.MulticastDelegate)
          Console.WriteLine("conStart and vowelStart are derived from MulticastDelegate.\n");

      // Execute the two delegates.
      Console.WriteLine("Executing the conStart delegate:");
      container.DisplayAllQualified(conStart);
      Console.WriteLine();
      Console.WriteLine("Executing the vowelStart delegate:");
      container.DisplayAllQualified(vowelStart);
      Console.WriteLine();

      // Create a new MulticastDelegate and call Combine to add two delegates.
      StringContainer.CheckAndDisplayDelegate multipleDelegates =
            (StringContainer.CheckAndDisplayDelegate) Delegate.Combine(conStart, vowelStart);

      // How many delegates does multipleDelegates contain?
      delegateList = multipleDelegates.GetInvocationList();
      Console.WriteLine("\nmultipleDelegates contains {0} delegates.\n",
                        delegateList.Length);

      // Pass this multicast delegate to DisplayAllQualified.
      Console.WriteLine("Executing the multipleDelegate delegate.");
      container.DisplayAllQualified(multipleDelegates);

      // Call remove and combine to change the contained delegates.
      multipleDelegates = (StringContainer.CheckAndDisplayDelegate) Delegate.Remove(multipleDelegates, vowelStart);
      multipleDelegates = (StringContainer.CheckAndDisplayDelegate) Delegate.Combine(multipleDelegates, conStart);

      // Pass multipleDelegates to DisplayAllQualified again.
      Console.WriteLine("\nExecuting the multipleDelegate delegate with two conStart delegates:");
      container.DisplayAllQualified(multipleDelegates);
   }
}
// The example displays the following output:
//    conStart contains 1 delegate(s).
//    vowelStart contains 1 delegate(s).
//
//    conStart and vowelStart are derived from MulticastDelegate.
//
//    Executing the conStart delegate:
//    This
//    multicast
//    delegate
//
//    Executing the vowelStart delegate:
//    is
//    a
//    example
//
//
//    multipleDelegates contains 2 delegates.
//
//    Executing the multipleDelegate delegate.
//    This
//    is
//    a
//    multicast
//    delegate
//    example
//
//    Executing the multipleDelegate delegate with two conStart delegates:
//    This
//    This
//    multicast
//    multicast
//    delegate
//    delegate
module Test

open System

// Define a delegate to handle string display.
type CheckAndDisplayDelegate = delegate of string -> unit

type StringContainer() =
    // A generic ResizeArray object that holds the strings.
    let container = ResizeArray()

    // A method that adds strings to the collection.
    member _.AddString(str) =
        container.Add str

    // Iterate through the strings and invoke the method(s) that the delegate points to.
    member _.DisplayAllQualified(displayDelegate: CheckAndDisplayDelegate) =
        for str in container do
            displayDelegate.Invoke str

// This module defines some functions to display strings.
module StringExtensions =
    // Display a string if it starts with a consonant.
    let conStart (str: string) =
        match str[0] with
        | 'a' | 'e' | 'i' | 'o' | 'u' -> ()
        | _ -> printfn $"{str}"
 
    // Display a string if it starts with a vowel.
    let vowelStart (str: string) =
        match str[0] with
        | 'a' | 'e' | 'i' | 'o' | 'u' -> printfn $"{str}"
        | _ -> ()
 
// Demonstrate the use of delegates, including the Remove and
// Combine methods to create and modify delegate combinations.
[<EntryPoint>]
let main _ =
    // Declare the StringContainer class and add some strings
    let container = StringContainer()
    container.AddString "This"
    container.AddString "is"
    container.AddString "a"
    container.AddString "multicast"
    container.AddString "delegate"
    container.AddString "example"

    // Create two delegates individually using different methods.
    let conStart = CheckAndDisplayDelegate StringExtensions.conStart
    let vowelStart = CheckAndDisplayDelegate StringExtensions.vowelStart 

    // Get the list of all delegates assigned to this MulticastDelegate instance.
    let delegateList = conStart.GetInvocationList()
    printfn $"conStart contains {delegateList.Length} delegate(s)."
    let delegateList = vowelStart.GetInvocationList()
    printfn $"vowelStart contains {delegateList.Length} delegate(s).\n"

    // Determine whether the delegates are System.Multicast delegates.
    if box conStart :? System.MulticastDelegate && box vowelStart :? System.MulticastDelegate then
        printfn "conStart and vowelStart are derived from MulticastDelegate.\n"

    // Execute the two delegates.
    printfn "Executing the conStart delegate:"
    container.DisplayAllQualified conStart
    printfn "\nExecuting the vowelStart delegate:"
    container.DisplayAllQualified vowelStart
    printfn ""

    // Create a new MulticastDelegate and call Combine to add two delegates.
    let multipleDelegates =
        Delegate.Combine(conStart, vowelStart) :?> CheckAndDisplayDelegate

    // How many delegates does multipleDelegates contain?
    let delegateList = multipleDelegates.GetInvocationList()
    printfn $"\nmultipleDelegates contains {delegateList.Length} delegates.\n"

    // Pass this multicast delegate to DisplayAllQualified.
    printfn "Executing the multipleDelegate delegate."
    container.DisplayAllQualified multipleDelegates

    // Call remove and combine to change the contained delegates.
    let multipleDelegates = Delegate.Remove(multipleDelegates, vowelStart) :?> CheckAndDisplayDelegate
    let multipleDelegates = Delegate.Combine(multipleDelegates, conStart) :?> CheckAndDisplayDelegate

    // Pass multipleDelegates to DisplayAllQualified again.
    printfn "\nExecuting the multipleDelegate delegate with two conStart delegates:"
    printfn $"{multipleDelegates}"
    0
// The example displays the following output:
//    conStart contains 1 delegate(s).
//    vowelStart contains 1 delegate(s).
//
//    conStart and vowelStart are derived from MulticastDelegate.
//
//    Executing the conStart delegate:
//    This
//    multicast
//    delegate
//
//    Executing the vowelStart delegate:
//    is
//    a
//    example
//
//
//    multipleDelegates contains 2 delegates.
//
//    Executing the multipleDelegate delegate.
//    This
//    is
//    a
//    multicast
//    delegate
//    example
//
//    Executing the multipleDelegate delegate with two conStart delegates:
//    This
//    This
//    multicast
//    multicast
//    delegate
//    delegate
Imports System.Collections.Generic

Class StringContainer
    ' Define a delegate to handle string display. 
    Delegate Sub CheckAndPrintDelegate(ByVal str As String)

    ' A generic list object that holds the strings.
    Private container As New List(Of String)()

     ' A method that adds strings to the collection. 
     Public Sub AddString(ByVal s As String)
        container.Add(s)
    End Sub

    ' Iterate through the strings and invoke the method(s) that the delegate points to.
    Public Sub DisplayAllQualified(ByVal displayDelegate As CheckAndPrintDelegate)
        For Each s In container
            displayDelegate(s)
        Next
    End Sub
End Class

' This class defines some methods to display strings. 
Class StringExtensions
    ' Display a string if it starts with a consonant. 
    Public Shared Sub ConStart(ByVal str As String)
        If Not (str.Chars(0) = "a"c Or str.Chars(0) = "e"c Or str.Chars(0) = "i"c _ 
                Or str.Chars(0) = "o"c Or str.Chars(0) = "u"c) Then
            Console.WriteLine(str)
        End If
    End Sub 

    ' Display a string if it starts with a vowel.
    Public Shared Sub VowelStart(ByVal str As String)
        If (str.Chars(0) = "a"c Or str.Chars(0) = "e"c Or str.Chars(0) = "i"c _
            Or str.Chars(0) = "o"c Or str.Chars(0) = "u"c) Then
            Console.WriteLine(str)
        End If
    End Sub 
End Class 

' Demonstrate the use of delegates, including the Remove and 
' Combine methods to create and modify delegate combinations. 
Class Test
    Public Shared Sub Main()
        ' Declare the StringContainer class and add some strings
        Dim container As New StringContainer()
        container.AddString("this")
        container.AddString("is")
        container.AddString("a")
        container.AddString("multicast")
        container.AddString("delegate")
        container.AddString("example")

        ' Create two delegates individually using different methods.
        Dim constart As StringContainer.CheckAndPrintDelegate = AddressOf StringExtensions.ConStart
        Dim vowelStart As StringContainer.CheckAndPrintDelegate = AddressOf StringExtensions.VowelStart

        ' Get the list of all delegates assigned to this MulticastDelegate instance. 
        Dim delegateList() As [Delegate] = conStart.GetInvocationList()
        Console.WriteLine("conStart contains {0} delegate(s).", delegateList.Length)
        delegateList = vowelStart.GetInvocationList()
        Console.WriteLine("vowelStart contains {0} delegate(s).", delegateList.Length)
        Console.WriteLine()
        
        ' Determine whether the delegates are System.Multicast delegates
        If TypeOf conStart Is System.MulticastDelegate And TypeOf vowelStart Is System.MulticastDelegate Then
            Console.WriteLine("conStart and vowelStart are derived from MulticastDelegate.")
            Console.WriteLine()
        End If

        ' Run the two single delegates one after the other.
        Console.WriteLine("Executing the conStart delegate:")
        container.DisplayAllQualified(conStart)
        Console.WriteLine("Executing the vowelStart delegate:")
        container.DisplayAllQualified(vowelStart)
        Console.WriteLine()

        ' Create a new MulticastDelegate and call Combine to add two delegates.
        Dim multipleDelegates As StringContainer.CheckAndPrintDelegate = 
                  CType([Delegate].Combine(conStart, vowelStart), 
                  StringContainer.CheckAndPrintDelegate)

        ' How many delegates does multipleDelegates contain?
        delegateList = multipleDelegates.GetInvocationList()
        Console.WriteLine("{1}multipleDelegates contains {0} delegates.{1}",
                          delegateList.Length, vbCrLf)

        ' Pass this mulitcast delegate to DisplayAllQualified.
        Console.WriteLine("Executing the multipleDelegate delegate.")
        container.DisplayAllQualified(multipleDelegates)

        ' Call remove and combine to change the contained delegates.
        multipleDelegates = CType([Delegate].Remove(multipleDelegates, vowelStart), 
                            StringContainer.CheckAndPrintDelegate)
        multipleDelegates = CType([Delegate].Combine(multipleDelegates, conStart), 
                            StringContainer.CheckAndPrintDelegate)

        ' Pass multipleDelegates to DisplayAllQualified again.
        Console.WriteLine()
        Console.WriteLine("Executing the multipleDelegate delegate with two conStart delegates:")
        container.DisplayAllQualified(multipleDelegates)
    End Sub 
End Class 
' The example displays the following output:
'    conStart contains 1 delegate(s).
'    vowelStart contains 1 delegate(s).
'    
'    conStart and vowelStart are derived from MulticastDelegate.
'    
'    Executing the conStart delegate:
'    This
'    multicast
'    delegate
'    
'    Executing the vowelStart delegate:
'    is
'    a
'    example
'    
'    
'    multipleDelegates contains 2 delegates.
'    
'    Executing the multipleDelegate delegate.
'    This
'    is
'    a
'    multicast
'    delegate
'    example
'    
'    Executing the multipleDelegate delegate with two conStart delegates:
'    This
'    This
'    multicast
'    multicast
'    delegate
'    delegate

Comentarios

MulticastDelegate es una clase especial. Los compiladores y otras herramientas pueden derivar de esta clase, pero no se puede derivar explícitamente de ella. Lo mismo sucede con la clase Delegate.

Además de los métodos que deleguen tipos heredan de MulticastDelegate, Common Language Runtime proporciona dos métodos especiales: BeginInvoke y EndInvoke. Para obtener más información sobre estos métodos, vea Llamar a métodos sincrónicos de forma asincrónica.

Un MulticastDelegate tiene una lista vinculada de delegados, denominada lista de invocación, que consta de uno o varios elementos. Cuando se invoca un delegado de multidifusión, los delegados de la lista de invocación se denominan sincrónicamente en el orden en que aparecen. Si se produce un error durante la ejecución de la lista, se produce una excepción.

Constructores

MulticastDelegate(Object, String)

Inicializa una nueva instancia de la clase MulticastDelegate.

MulticastDelegate(Type, String)

Inicializa una nueva instancia de la clase MulticastDelegate.

Propiedades

HasSingleTarget

Obtiene un valor que indica si el Delegate tiene un único destino de invocación.

(Heredado de Delegate)
Method

Obtiene el método representado por el delegado.

(Heredado de Delegate)
Target

Obtiene la instancia de clase en la que el delegado actual invoca el método de instancia.

(Heredado de Delegate)

Métodos

Clone()

Crea una copia superficial del delegado.

(Heredado de Delegate)
CombineImpl(Delegate)

Combina este Delegate con el Delegate especificado para formar un nuevo delegado.

CombineImpl(Delegate)

Concatena las listas de invocación del delegado de multidifusión (combinable) especificado y el delegado de multidifusión actual (combinable).

(Heredado de Delegate)
DynamicInvoke(Object[])

Invoca dinámicamente (enlazado en tiempo de ejecución) el método representado por el delegado actual.

(Heredado de Delegate)
DynamicInvokeImpl(Object[])

Procesa la lista de invocación completa.

DynamicInvokeImpl(Object[])

Invoca dinámicamente (enlazado en tiempo de ejecución) el método representado por el delegado actual.

(Heredado de Delegate)
Equals(Object)

Determina si este delegado de multidifusión y el objeto especificado son iguales.

GetHashCode()

Devuelve el código hash de esta instancia.

GetInvocationList()

Devuelve la lista de invocación de este delegado de multidifusión, en orden de invocación.

GetMethodImpl()

Devuelve un método representado por el MulticastDelegateactual.

GetMethodImpl()

Obtiene el método representado por el delegado actual.

(Heredado de Delegate)
GetObjectData(SerializationInfo, StreamingContext)
Obsoletos.

Rellena un objeto SerializationInfo con todos los datos necesarios para serializar esta instancia.

GetObjectData(SerializationInfo, StreamingContext)
Obsoletos.

No se admite.

(Heredado de Delegate)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
MemberwiseClone()

Crea una copia superficial del Objectactual.

(Heredado de Object)
RemoveImpl(Delegate)

Quita un elemento de la lista de invocación de este MulticastDelegate que es igual al delegado especificado.

RemoveImpl(Delegate)

Quita la lista de invocación de un delegado de la lista de invocación de otro delegado.

(Heredado de Delegate)
ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Operadores

Equality(MulticastDelegate, MulticastDelegate)

Determina si dos objetos MulticastDelegate son iguales.

Inequality(MulticastDelegate, MulticastDelegate)

Determina si dos objetos MulticastDelegate no son iguales.

Métodos de extensión

GetMethodInfo(Delegate)

Obtiene un objeto que representa el método representado por el delegado especificado.

Se aplica a