必需参数和重载组

本主题适用于 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(zh-cn,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 包含 LatitudeLongitude 参数。G2 包含 StreetCityStateG3 包含 StreetZipName 也是必需参数,但不属于重载组的一部分。为使该活动有效,必须绑定 Name 和一个(且只有一个)重载组中的所有参数。

重载组不能为另一个重载组的子集或等价集。当子集仅包含 RequiredArgumentfalse 的参数时例外,这是此规则的唯一例外情况。重载组可以重叠,但如果组的交集包含一个或两个重载组的所有必需参数,则会出错。如果重载组中的所有 RequiredArgument 参数均被绑定,则该组将被视为绑定的重载组。如果一个组具有零个 RequiredArgument 参数且至少有一个参数被绑定,则该组将被视为绑定的组。如果没有绑定任何组,除非其中的一个重载组中未包含任何 RequiredArgument 参数,否则将会出错。不允许绑定多个重载组中的 RequiredArgument 参数。绑定多个重载组(即,绑定一个重载组中的所有必需参数,并同时绑定另一个重载组中的所有参数)的做法是错误的。