MulticastDelegate 类 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
表示多播委托;也就是说,在其调用列表中可以有多个元素的委托。
public ref class MulticastDelegate abstract : Delegatepublic abstract class MulticastDelegate : Delegate[System.Serializable]
public abstract class MulticastDelegate : Delegate[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class MulticastDelegate : Delegatetype MulticastDelegate = class
    inherit Delegate[<System.Serializable>]
type MulticastDelegate = class
    inherit Delegate[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type MulticastDelegate = class
    inherit DelegatePublic MustInherit Class MulticastDelegate
Inherits Delegate- 继承
- 属性
示例
以下示例定义一个类,StringContainer,其中包括字符串集合。 其成员之一是 CheckAndDisplayDelegate 委托,该委托用于显示存储在满足特定条件的 StringContainer 对象中的字符串。 委托采用单个字符串作为参数并返回 void(或者,在 Visual Basic 中,它是 Sub 过程)。 它还包括一个方法,DisplayAllQualified,具有单个参数,CheckAndDisplayDelegate 委托。 这样就可以调用该方法,并显示一组字符串,这些字符串根据委托包含的方法进行筛选。
该示例还定义了一个实用工具类,StringExtensions,该类具有两种方法:
- ConStart,它显示以同音开头的字符串。
- VowelStart,它显示以元音开头的字符串。
请注意,这两种方法都包含单个字符串参数并返回 void。 换句话说,可以将这两种方法分配给 CheckAndDisplayDelegate 委托。
              Test.Main 方法是应用程序入口点。 它实例化 StringContainer 对象,使用字符串填充该对象,并创建两个调用单个方法的 CheckAndDisplayDelegate 委托(conStart 和 vowelStart)。 然后,它会调用 Delegate.Combine 方法来创建 multipleDelegates 委托,该委托最初包含 ConStart 和 VowelStart 委托。 请注意,调用 multipleDelegates 委托时,它会按原始顺序显示集合中的所有字符串。 这是因为每个字母单独传递给每个委托,并且每个字母仅满足两个委托中的一个筛选条件。 最后,在调用 Delegate.Remove 和 Delegate.Combine后,multipleDelegates 包含两个 conStart 委托。 调用该对象时,StringContainer 对象中的每个字符串都会显示两次。
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
注解
MulticastDelegate 是一个特殊类。 编译器和其他工具可以从此类派生,但不能显式派生自它。 Delegate 类也是如此。
除了委托类型继承自 MulticastDelegate的方法外,公共语言运行时还提供两种特殊方法:BeginInvoke 和 EndInvoke。 有关这些方法的详细信息,请参阅 异步调用同步方法。
MulticastDelegate 具有链接的委托列表,称为调用列表,由一个或多个元素组成。 调用多播委托时,调用列表中的委托按显示顺序同步调用。 如果在执行列表期间发生错误,则会引发异常。
构造函数
| MulticastDelegate(Object, String) | 初始化 MulticastDelegate 类的新实例。 | 
| MulticastDelegate(Type, String) | 初始化 MulticastDelegate 类的新实例。 | 
属性
| HasSingleTarget | 获取一个值,该值指示 Delegate 是否具有单个调用目标。(继承自 Delegate) | 
| Method | 获取委托表示的方法。(继承自 Delegate) | 
| Target | 获取当前委托调用实例方法的类实例。(继承自 Delegate) | 
方法
| Clone() | 创建委托的浅表副本。(继承自 Delegate) | 
| CombineImpl(Delegate) | |
| CombineImpl(Delegate) | 连接指定的多播(可组合)委托和当前多播(可组合)委托的调用列表。(继承自 Delegate) | 
| DynamicInvoke(Object[]) | 动态调用由当前委托表示的方法(后期绑定)。(继承自 Delegate) | 
| DynamicInvokeImpl(Object[]) | 处理完整的调用列表。 | 
| DynamicInvokeImpl(Object[]) | 动态调用由当前委托表示的方法(后期绑定)。(继承自 Delegate) | 
| Equals(Object) | 确定此多播委托和指定的对象是否相等。 | 
| GetHashCode() | 返回此实例的哈希代码。 | 
| GetInvocationList() | 返回此多播委托的调用列表,即调用顺序。 | 
| GetMethodImpl() | 返回由当前 MulticastDelegate表示的方法。 | 
| GetMethodImpl() | 获取由当前委托表示的方法。(继承自 Delegate) | 
| GetObjectData(SerializationInfo, StreamingContext) | 
				已过时.
			 使用序列化此实例所需的所有数据填充 SerializationInfo 对象。 | 
| GetObjectData(SerializationInfo, StreamingContext) | 
		已过时.
	 不支持。(继承自 Delegate) | 
| GetType() | 获取当前实例的 Type。(继承自 Object) | 
| MemberwiseClone() | 创建当前 Object的浅表副本。(继承自 Object) | 
| RemoveImpl(Delegate) | 从此 MulticastDelegate 的调用列表中删除与指定委托相等的元素。 | 
| RemoveImpl(Delegate) | 从另一个委托的调用列表中删除委托的调用列表。(继承自 Delegate) | 
| ToString() | 返回一个表示当前对象的字符串。(继承自 Object) | 
运算符
| Equality(MulticastDelegate, MulticastDelegate) | 确定两个 MulticastDelegate 对象是否相等。 | 
| Inequality(MulticastDelegate, MulticastDelegate) | 确定两个 MulticastDelegate 对象是否不相等。 | 
扩展方法
| GetMethodInfo(Delegate) | 获取一个对象,该对象表示由指定委托表示的方法。 |