次の方法で共有


必須の引数とオーバーロード グループ

アクティビティを構成して、アクティビティが実行に対して有効になるように特定の引数をバインドする必要があります。 RequiredArgument属性は、アクティビティの特定の引数が必要であることを示すために使用され、OverloadGroup属性を使用して、必要な引数のカテゴリをまとめてグループ化します。 この属性を使用すると、アクティビティ作成者は単純または複雑なアクティビティ検証構成を提供できます。

必要な引数を使用する

アクティビティで RequiredArgument 属性を使用するには、 RequiredArgumentAttributeを使用して目的の引数を指定します。 この例では、2 つの必須引数を持つ 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 アクティビティは 3 つの引数を使用して定義され、 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で指定された名前が付けられます。 このアクティビティは、オーバーロード グループ内の引数のセットが 1 つだけバインドされている場合に有効です。 次の例では、 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; }
}

このアクティビティの目的は、米国内の場所を指定することです。 これを行うには、アクティビティのユーザーは、3 つの引数グループのいずれかを使用して場所を指定できます。 引数の有効な組み合わせを指定するために、3 つのオーバーロード グループが定義されます。 G1 には、 Latitude 引数と Longitude 引数が含まれています。 G2 には、 StreetCity、および Stateが含まれています。 G3 には、 StreetZipが含まれています。 Name は必須の引数でもありますが、オーバーロード グループの一部ではありません。 このアクティビティを有効にするには、 Name を 1 つのオーバーロード グループからのすべての引数とバインドする必要があります。

次の例では、 データベース アクセス アクティビティ のサンプルから取得した、 ConnectionStringConfigFileSectionNameの 2 つのオーバーロード グループがあります。 このアクティビティを有効にするには、 ProviderName 引数と ConnectionString 引数をバインドするか、 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; }
}

オーバーロード グループを定義する場合:

  • オーバーロード グループは、別のオーバーロード グループのサブセットまたは同等のセットにすることはできません。

    この規則には 1 つの例外があります。 オーバーロード グループが別のオーバーロード グループのサブセットであり、そのサブセットに RequiredArgumentfalse引数のみが含まれている場合、オーバーロード グループは有効です。

  • オーバーロード グループは重複する可能性がありますが、グループの共通部分にオーバーロード グループの一方または両方の必須引数がすべて含まれている場合はエラーになります。 前の例では、 G2G3 のオーバーロード グループが重複していましたが、交差部分に 1 つまたは両方のグループのすべての引数が含まれていないため、これが有効でした。

オーバーロード グループ内の引数をバインドする場合:

  • オーバーロード グループは、グループ内のすべての RequiredArgument 引数がバインドされている場合にバインドされていると見なされます。
  • グループに 0 個の RequiredArgument 引数があり、少なくとも 1 つの引数がバインドされている場合、グループはバインドされていると見なされます。
  • 1 つのオーバーロード グループに RequiredArgument 引数がない場合を除き、オーバーロード グループがバインドされていない場合は検証エラーです。
  • 複数のオーバーロード グループをバインドするとエラーになります。つまり、1 つのオーバーロード グループ内のすべての必須引数がバインドされ、別のオーバーロード グループ内の引数もバインドされます。