Прочитать на английском

Поделиться через


MulticastDelegate Класс

Определение

Представляет делегат многоадресной рассылки; То есть делегат, который может содержать несколько элементов в списке вызовов.

public abstract class MulticastDelegate : Delegate
[System.Serializable]
public abstract class MulticastDelegate : Delegate
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class MulticastDelegate : Delegate
Наследование
MulticastDelegate
Атрибуты

Примеры

В следующем примере определяется класс, 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.CombinemultipleDelegates содержит два делегата conStart. При вызове каждая строка в объекте StringContainer отображается дважды.

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

Комментарии

MulticastDelegate — это специальный класс. Компиляторы и другие средства могут быть производными от этого класса, но вы не можете получить от него явным образом. То же самое относится к классу Delegate.

Помимо методов, наследуемых от MulticastDelegate, среда CLR предоставляет два специальных метода: BeginInvoke и EndInvoke. Дополнительные сведения об этих методах см. в асинхронновызовов синхронных методов.

MulticastDelegate содержит связанный список делегатов, называемый списком вызовов, состоящим из одного или нескольких элементов. При вызове делегата многоадресной рассылки делегаты в списке вызовов вызываются синхронно в порядке их отображения. Если во время выполнения списка возникает ошибка, создается исключение.

Конструкторы

MulticastDelegate(Object, String)

Инициализирует новый экземпляр класса MulticastDelegate.

MulticastDelegate(Type, String)

Инициализирует новый экземпляр класса MulticastDelegate.

Свойства

HasSingleTarget

Возвращает значение, указывающее, имеет ли Delegate один целевой объект вызова.

(Унаследовано от Delegate)
Method

Возвращает метод, представленный делегатом.

(Унаследовано от Delegate)
Target

Возвращает экземпляр класса, на котором текущий делегат вызывает метод экземпляра.

(Унаследовано от Delegate)

Методы

Clone()

Создает неглубокую копию делегата.

(Унаследовано от Delegate)
CombineImpl(Delegate)

Объединяет этот Delegate с указанным 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)

Возвращает объект, представляющий метод, представленный указанным делегатом.

Применяется к

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0