System.MulticastDelegate 类

方法描述

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

语法定义(C# System.MulticastDelegate 类 的用法)

[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class MulticastDelegate : Delegate

构造函数

构造函数名称 构造函数描述
MulticastDelegate(Object, String) 初始化 MulticastDelegate 类的新实例。
MulticastDelegate(Type, String) 初始化 MulticastDelegate 类的新实例。

成员/方法

方法名称 方法描述
Clone 创建委托的浅表副本。 (继承自 Delegate。)
CombineImpl 将此 Delegate 与指定的 Delegate 合并,以形成一个新委托。 (重写 Delegate.CombineImpl(Delegate)。)
DynamicInvoke 动态调用(后期绑定)由当前委托所表示的方法。 (继承自 Delegate。)
DynamicInvokeImpl 动态调用(后期绑定)由当前委托所表示的方法。 (继承自 Delegate。)
Equals 确定此多路广播委托和指定的对象是否相等。 (重写 Delegate.Equals(Object)。)
Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。) 在 XNA Framework 中,此成员由 Finalize() 重写。
GetHashCode 返回此实例的哈希代码。 (重写 Delegate.GetHashCode()。)
GetInvocationList 按照调用顺序返回此多路广播委托的调用列表。 (重写 Delegate.GetInvocationList()。)
GetMethodImpl 返回由当前的 MulticastDelegate 表示的静态方法。 (重写 Delegate.GetMethodImpl()。)
GetObjectData 用序列化该实例所需的所有数据填充 SerializationInfo 对象。 (重写 Delegate.GetObjectData(SerializationInfo, StreamingContext)。)
GetType 获取当前实例的 Type。 (继承自 Object。)
MemberwiseClone 创建当前 Object 的浅表副本。 (继承自 Object。)
RemoveImpl 从此 MulticastDelegate 的调用列表中移除与指定委托相等的元素。 (重写 Delegate.RemoveImpl(Delegate)。)
ToString 返回表示当前对象的字符串。 (继承自 Object。)

提示和注释

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

除了委托类型从 MulticastDelegate 继承的方法外,公共语言运行时还提供了两个特殊方法:BeginInvoke 和 EndInvoke。 有关这些方法的更多信息,请参见使用异步方式调用同步方法。

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

System.MulticastDelegate 类例子

下面的示例说明如何使用从 MulticastDelegate 派生的类。

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

继承层次结构

System.Object

System.Delegate

System.MulticastDelegate

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

线程安全

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。

相关资源

System 命名空间
MSDN