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


Динамические аргументы

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

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

Подробные сведения об образце

Перед выполнением среда выполнения строит описание действия путем анализа открытых членов типа действия и автоматического объявления аргументов, переменных, дочерних действий и делегатов действия как частей метаданных действия. Это делается, чтобы обеспечить правильное построение рабочего процесса, а также управление связями времени выполнения и правилами времени существования с помощью реализации. Обычно автор действия определяет аргументы действия, задавая открытые члены типа действия, производные от Argument. Для каждого открытого члена, производного от Argument, среда выполнения создает RuntimeArgument и привязывает его к предоставленному пользователем набору аргументов этого члена. Но в некоторых случаях получатель действия предоставляет конфигурацию, которая определяет набор аргументов. Автор действия переопределяет CacheMetadata, чтобы настроить способ построения метаданных действия, в том числе набор аргументов, связанных с действием.

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

Ee663219.note(ru-ru,VS.100).gifПримечание
Цель этого образца — продемонстрировать переопределение метода CacheMetadata и использование класса RuntimeArgument. Существует несколько проблем, связанных с разновидностями методов, которые может вызывать действие. Например, оно не работает с универсальными шаблонами или массивами параметров. Действие InvokeMethod, поставляемое с .NET Framework, обрабатывает эти и другие случаи.

Действие MethodInvoke переопределяет метод CacheMetadata и начинает с создания класса RuntimeArgument для обработки любого результата вызова метода. Оно привязывает этот аргумент RuntimeArgument к открыто задаваемому классу OutArgument с именем Result. Если MethodInvoke.Result имеет значение null, среда выполнения автоматически заполняет его значением OutArgument, которому присвоено выражение по умолчанию для данного типа. Поэтому автору действия никогда не требуется проверять, имеет ли свойство аргумента значение null.

Затем переопределение метода CacheMetadata определяет MethodInfo, используемый для вызова, из предоставляемых пользователем значений MethodName и TargetType. Метод DetermineMethodInfo принимает параметр CodeActivityMetadata, переданный переопределению CacheMetadata, чтобы о любых ошибках конфигурации сообщалось как об ошибках проверки. Это выполняется с помощью вызова метода metadata.AddValidationError.

После того, как задано значение MethodInfo, образец выполняет перебор параметров MethodInfo. Для каждого параметра он создает объект RuntimeArgument и привязывает его к соответствующему аргументу в предоставленной пользователем коллекции из свойства Parameters. Наконец, коллекция объектов RuntimeArgument связывается с действием посредством вызова metadata.SetArgumentsCollection.

Обратите внимание, что разрешение аргументов может быть выполнено с использованием класса RuntimeArgument, как в случае с resultArgument, или по предоставленному пользователем аргументу, как в случае коллекции Parameters.

Использование этого образца

  1. Откройте в среде Visual Studio 2010 файл DynamicArguments.sln.

  2. Чтобы построить решение, нажмите клавишу F6.

  3. Чтобы запустить решение, нажмите клавиши CTRL+F5.

Ee663219.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\Basic\CustomActivities\Code-Bodied\DynamicArguments