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


Обязательные аргументы и группы перегруженных аргументов

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

Действия можно настроить таким образом, чтобы для их выполнения требовалась привязка определенных аргументов. Атрибут RequiredArgument указывает, что для действия необходимы определенные аргументы, а атрибут OverloadGroup используется для группирования категорий необходимых аргументов. С помощью атрибутов авторы действий могут реализовать простые или сложные конфигурации проверки правильности действий.

Использование обязательных аргументов

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

public sealed class Add : CodeActivity<int>
{
    [RequiredArgument]
    public InArgument<int> Operand1 { get; set; }

    [RequiredArgument]
    public InArgument<int> Operand2 { get; set; }

    protected override int Execute(CodeActivityContext context)
    {
        return Operand1.Get(context) + Operand2.Get(context);
    }
}

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

<Activity x:Class="ValidationDemo.Add" ...>
  <x:Members>
    <x:Property Name="Operand1" Type="InArgument(x:Int32)">
      <x:Property.Attributes>
        <RequiredArgumentAttribute />
      </x:Property.Attributes>
    </x:Property>
    <x:Property Name="Operand2" Type="InArgument(x:Int32)">
      <x:Property.Attributes>
        <RequiredArgumentAttribute />
      </x:Property.Attributes>
    </x:Property>
    <x:Property Name="Result" Type="OutArgument(x:Int32)" />
  </x:Members>
  <Assign>
    <Assign.To>
      <OutArgument x:TypeArguments="x:Int32">[Result]</OutArgument>
    </Assign.To>
    <Assign.Value>
      <InArgument x:TypeArguments="x:Int32">[Operand1 + Operand2]</InArgument>
    </Assign.Value>
  </Assign>
</Activity>

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

Не указано значение необходимого аргумента действия Operand1.
Ee358733.note(ru-ru,VS.100).gifПримечание
Дополнительные сведения о проверке и обработке ошибок проверки и предупреждений см. в разделе Вызов проверки действия.

Использование групп перегрузки

Группы перегрузки предоставляют метод, позволяющий определить, какие комбинации аргументов допустимы для действия. Аргументы группируются с помощью OverloadGroupAttribute. Каждой группе присваивается имя, указанное в OverloadGroupAttribute. Действие допустимо, когда привязан только один из наборов аргументов в группе перегрузки. В следующем примере определяется класс CreateLocation.

class CreateLocation: Activity
{
    [RequiredArgument]
    public InArgument<string> Name { get; set; }
   
    public InArgument<string> Description { get; set; }

    [RequiredArgument]
    [OverloadGroup("G1")]
    public InArgument<int> Latitude { get; set; }
    
    [RequiredArgument]
    [OverloadGroup("G1")]
    public InArgument<int> Longitude { get; set; }

    [RequiredArgument]
    [OverloadGroup("G2")][OverloadGroup("G3")]
    public InArgument<string> Street { get; set; }

    [RequiredArgument]
    [OverloadGroup("G2")]
    public InArgument<string> City { get; set; }

    [RequiredArgument]
    [OverloadGroup("G2")]
    public InArgument<string> State { get; set; }
    
    [RequiredArgument]
    [OverloadGroup("G3")]
    public InArgument<int> Zip { get; set; }                
}

Задача данного действия — указать местоположение в США. Для этого пользователь действия может указать местоположение с помощью одной из трех групп аргументов. Чтобы указать допустимые комбинации аргументов, необходимо определить три группы перегрузки. G1 содержит аргументы Latitude и Longitude. G2 содержит Street, City и State. G3 содержит Street и Zip. Name тоже является обязательным аргументом, но не входит в группу перегрузки. Чтобы данное действие было допустимым, Name должно быть привязано вместе со всеми аргументами из одной и только одной группы перегрузки.

Группа перегрузки не может быть подмножеством или эквивалентным набором другой группы перегрузки. Единственное исключение из этого правила — подмножество, которое содержит только аргументы, у которых RequiredArgument равно false. Группы перегрузки могут пересекаться, но это приводит к ошибке, если пересечение групп содержит все обязательные аргументы одной или обеих групп. Группа перегрузки считается связанной, если все аргументы RequiredArgument в этой группе — связанные. Если в группе нет ни одного аргумента RequiredArgument и хотя бы один аргумент связан, то группа также считается связанной. Возникает ошибка, если ни одна из групп не является связанной, если только в одной группе перегруженных вариантов нет аргументов RequiredArgument. Привязка аргументов RequiredArgument из нескольких групп перегруженных вариантов не допускается. При наличии нескольких привязанных групп перегрузки возникает ошибка, т. е. все обязательные аргументы в одной группе являются связанными и любой аргумент в другой группе перегрузки также связан.