必需参数和重载组

可以配置活动,以便需要某些参数才能使活动有效执行。 该 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<T> 活动来执行添加作。

<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”的值。

注释

有关检查和处理验证错误和警告的详细信息,请参阅 调用活动验证

使用重载组

重载组提供用于指示哪些参数组合在活动中有效的方法。 使用 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 包含 StreetZip. Name 也是必需参数,但它不是重载组的一部分。 要使此活动有效,Name 必须与仅一个重载组中的所有参数绑定在一起。

在以下示例中,取自数据库访问活动示例,有两个重载组:ConnectionStringConfigFileSectionName。 要使此活动有效,必须绑定 ProviderNameConnectionString 参数,或仅绑定 ConfigName 参数,但不能同时绑定这两类参数。

public class DbUpdate: AsyncCodeActivity
{
    [RequiredArgument]
    [OverloadGroup("ConnectionString")]
    [DefaultValue(null)]
    public InArgument<string> ProviderName { get; set; }

    [RequiredArgument]
    [OverloadGroup("ConnectionString")]
    [DependsOn("ProviderName")]
    [DefaultValue(null)]
    public InArgument<string> ConnectionString { get; set; }

    [RequiredArgument]
    [OverloadGroup("ConfigFileSectionName")]
    [DefaultValue(null)]
    public InArgument<string> ConfigName { get; set; }

    [DefaultValue(null)]
    public CommandType CommandType { get; set; }

    [RequiredArgument]
    public InArgument<string> Sql { get; set; }

    [DependsOn("Sql")]
    [DefaultValue(null)]
    public IDictionary<string, Argument> Parameters { get; }

    [DependsOn("Parameters")]
    public OutArgument<int> AffectedRecords { get; set; }
}

定义重载组时:

  • 重载组不能是另一个重载组的子集或等效集。

    注释

    此规则有一个例外。 如果重载组是另一个重载组的子集,并且子集仅包含其中RequiredArgumentfalse的参数,则重载组有效。

  • 重载组可以重叠,但如果组的交集包含一个或两个重载组的所有必需自变量,则会出错。 在前面的示例中,G2G3 重载组重叠,但因为交集不包含一个或两个组的所有自变量,所以这是有效的。

当在重载组中绑定参数时:

  • 如果组中的所有 RequiredArgument 参数都绑定,则重载组被视为绑定。
  • 如果组具有零 RequiredArgument 个自变量,并且至少绑定了一个参数,则将该组视为绑定。
  • 如果没有绑定任何重载组,除非其中的一个重载组中未包含任何 RequiredArgument 参数,否则它是一个验证错误。
  • 绑定多个重载组是错误的,即一个重载组中的所有必需参数都绑定,另一个重载组中的任何参数也绑定。