MulticastDelegate多路广播委托

MulticastDelegate

表示多路广播委托;即,其调用列表中可以拥有多个元素的委托。

继承层次结构
System.Object
   System.Delegate
    System.MulticastDelegate
       派生类


备注

MulticastDelegate 是一个特殊类。编译器和其他工具可以从此类派生,但是您不能显式地从此类进行派生。Delegate 类也是如此。

MulticastDelegate 拥有一个带有链接的委托列表,该列表称为调用列表,它包含一个或多个元素。在调用多路广播委托时,将按照调用列表中的委托出现的顺序来同步调用这些委托。如果在该列表的执行过程中发生错误,则会引发异常。

Delegate 方法
Combine 已重载。 将指定的多路广播(可组合)委托的调用列表连接起来。
GetInvocationList 返回委托的调用列表。
MulticastDelegate 方法
Remove  从一个委托的调用列表中移除另一个委托的最后一个调用列表。 (从 Delegate 继承。)

示例
using System;

    
// This class contains strings. It has a member method that
    
// accepts a multicast delegate as a parameter and calls it.

    
class HoldsStrings
    {
        
// The following line causes the compiler to generate
        
// a new delegate class named CheckAndPrintDelegate that
        
// inherits from System.MulticastDelegate.
        public delegate void CheckAndPrintDelegate(string str);

        
// An ArrayList that holds strings
        private System.Collections.ArrayList myStringArray = new System.Collections.ArrayList();

        
// A method that adds more strings to the Collection
        public void addstring( string str) {
            myStringArray.Add(str);
        }

        
// Iterate through the strings and invoke the method(s) that the delegate points to
        public void PrintAllQualified(CheckAndPrintDelegate myDelegate) {
            
foreach (string str in myStringArray) {
                myDelegate(str);
            }
        }
    }   
//end of class HoldsStrings

    
// This class contains a few sample methods
    class StringFuncs
    {
        
// This method prints a string that it is passed if the string starts with a vowel
        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);
        }

        
// This method prints a string that it is passed if the string starts with a consonant
        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);
        }
    }

    
// This class demonstrates using Delegates, including using the Remove and
    
// Combine methods to create and modify delegate combinations.
    class Test
    {
        
static public void Main()
        {
            
// Declare the HoldsStrings class and add some strings
            HoldsStrings myHoldsStrings = new HoldsStrings();
            myHoldsStrings.addstring(
"This");
            myHoldsStrings.addstring(
"is");
            myHoldsStrings.addstring(
"a");
            myHoldsStrings.addstring(
"multicast");
            myHoldsStrings.addstring(
"delegate");
            myHoldsStrings.addstring(
"example");

            
// Create two delegates individually using different methods
            HoldsStrings.CheckAndPrintDelegate ConStartDel =
                
new HoldsStrings.CheckAndPrintDelegate(StringFuncs.ConStart);
            HoldsStrings.CheckAndPrintDelegate VowStartDel 
=
                
new HoldsStrings.CheckAndPrintDelegate(StringFuncs.VowelStart);

            
// Demonstrate that MulticastDelegates may store only one delegate
            Delegate [] DelegateList;

            
// Returns an array of all delegates stored in the linked list of the
            
// MulticastDelegate. In these cases the lists will hold only one (Multicast) delegate
            DelegateList = ConStartDel.GetInvocationList();
            Console.WriteLine(
"ConStartDel contains " + DelegateList.Length + " delegate(s).");
            DelegateList 
= VowStartDel.GetInvocationList();
            Console.WriteLine(
"ConStartVow contains " + DelegateList.Length + " delegate(s).");

            
// Determine whether the delegates are System.Multicast delegates
            
// if (ConStartDel is System.MulticastDelegate && VowStartDel is System.MulticastDelegate) {
                Console.WriteLine("ConStartDel and ConStartVow are System.MulticastDelegates");
            
// }

            
// Run the two single delegates one after the other
            Console.WriteLine("Running ConStartDel delegate:");
            myHoldsStrings.PrintAllQualified(ConStartDel);
            Console.WriteLine(
"Running VowStartDel delegate:");
            myHoldsStrings.PrintAllQualified(VowStartDel);

            
// Create a new, empty MulticastDelegate
            HoldsStrings.CheckAndPrintDelegate MultiDel;

            
// Delegate.Combine receives an unspecified number of MulticastDelegates as parameters
            MultiDel = (HoldsStrings.CheckAndPrintDelegate) Delegate.Combine(ConStartDel, VowStartDel);

            
// How many delegates is this delegate holding?
            DelegateList = MultiDel.GetInvocationList();
            Console.WriteLine(
"\nMulitDel contains " + DelegateList.Length + " delegates.");

            
// What happens when this mulitcast delegate is passed to PrintAllQualified
            Console.WriteLine("Running the multiple delegate that combined the first two");
            myHoldsStrings.PrintAllQualified(MultiDel);

            
// The Remove and Combine methods modify the multiple delegate
            MultiDel = (HoldsStrings.CheckAndPrintDelegate) Delegate.Remove(MultiDel, VowStartDel);
            MultiDel 
= (HoldsStrings.CheckAndPrintDelegate) Delegate.Combine(MultiDel, ConStartDel);

            
// Finally, pass the combined delegates to PrintAllQualified again
            Console.WriteLine("\nRunning the multiple delegate that contains two copies of ConStartDel:");
            myHoldsStrings.PrintAllQualified(MultiDel);

            
return;
        }   
//end of main
    }   //end of Test

posted on 2009-08-18 17:14  jdmei520  阅读(556)  评论(0编辑  收藏  举报

导航