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


Неуниверсальное действие ForEach

Данный раздел относится к версии Windows Workflow Foundation 4.

В область элементов .NET Framework, версия 4 входит набор действий потока управления, включая элемент ForEach, который позволяет проходить по коллекциям IEnumerable.

Свойство Values элемента ForEach должно иметь тип IEnumerable. Это запрещает пользователям проходить по структурам данных, в которых реализован интерфейс IEnumerable (например, ArrayList). Неуниверсальная версия ForEach выполняет это требование за счет большей гибкости во время выполнения, чтобы обеспечить совместимость типов значений в коллекции.

В этом образце показано, как реализовать неуниверсальное действие ForEach и конструктор для него. Это действие позволяет проходить по ArrayList.

Действие ForEach

Оператор foreach в C# и Visual Basic перечисляет элементы коллекции, выполняя внедренные в цикле операторы для каждого элемента в коллекции. Действиями WF, эквивалентными foreach, являются действия ForEach и ParallelForEach. Действие ForEach содержит список значений и содержимое. Во время выполнения действие проходит по списку, и текст действия выполняется для каждого значения в списке.

Для большинства случаев универсальная версия действия является предпочтительной, поскольку она охватывает большинство сценариев, в которых будет использоваться действие, и предоставляет возможность проверки соответствия типов во время компиляции. Неуниверсальная версия позволяет проходить по типам, где реализован неуниверсальный интерфейс IEnumerable.

Определение класса

В следующем примере кода показано определение неуниверсального действия ForEach.

[ContentProperty("Body")]
public class ForEach : NativeActivity
{
    [RequiredArgument]
    [DefaultValue(null)]
    InArgument<IEnumerable> Values { get; set; }

    [DefaultValue(null)]
    [DependsOn("Values")]
    ActivityAction<object> Body { get; set; } 
}
  • Содержание (необязательно)
    Действие ActivityAction типа Object, которое выполняется для каждого элемента в коллекции. Каждый отдельный элемент передается в текст через свойство Argument.
  • Значения (необязательно)
    Коллекция элементов, по которой выполняется проход. Проверка совместимости типов для всех элементов коллекции проводится во время выполнения.

Пример использования ForEach

В следующем кода демонстрируется использование в приложении действия ForEach.

string[] names = { "bill", "steve", "ray" };

DelegateInArgument<object> iterationVariable = new DelegateInArgument<object>() { Name = "iterationVariable" };

Activity sampleUsage =
    new ForEach
    {
       Values = new InArgument<IEnumerable>(c=> names),
       Body = new ActivityAction<object> 
       {                        
           Argument = iterationVariable,
           Handler = new WriteLine
           {
               Text = new InArgument<string>(env => string.Format("Hello {0}",                                                               iterationVariable.Get(env)))
           }
       }
   };

Условие Сообщение Важность Тип исключения

Значением является null

Не указано значение необходимого аргумента действия "Values".

Ошибка

InvalidOperationException

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

Конструктор действий для образца аналогичен конструктору, предоставляемому для встроенного действия ForEach. Конструктор выводится в области элементов Образцы, категория Неуниверсальные действия. Конструктор на панели инструментов называется ForEachWithBodyFactory, поскольку действие предоставляет на панели инструментов объект IActivityTemplateFactory, который создает действие со свойством, настроенным как ActivityAction.

public sealed class ForEachWithBodyFactory : IActivityTemplateFactory
{
    public Activity Create(DependencyObject target)
    {
        return new Microsoft.Samples.Activities.Statements.ForEach()
        {
            Body = new ActivityAction<object>()
            {
                Argument = new DelegateInArgument<object>()
                {
                    Name = "item"
                }
            }
        };
    }
}

Выполнение этого образца

  1. Установите выбранный проект в качестве проекта для запуска решения.

    1. В образце CodeTestClient показано использование действия в коде.

    2. В образце DesignerTestClient показано использование действия в конструкторе.

  2. Постройте и запустите проект.

Ee834519.Important(ru-ru,VS.100).gif Примечание
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).

<диск_установки>:\WF_WCF_Samples

Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.

<диск_установки>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\NonGenericForEach