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

このトピックの内容は、Windows Workflow Foundation 4 に該当します。

アクティビティは、アクティビティの実行を有効にするためには特定の引数をバインドする必要があるように構成できます。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 も使用されます。この例では、3 つの引数を持つ 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>

アクティビティが使用され、いずれかの必須引数がバインドされていない場合は、次の検証エラーが返されます。

"Value for a required activity argument 'Operand1' was not supplied."
Ee358733.note(ja-jp,VS.100).gif注 :
検証のエラーと警告の確認方法と処理方法詳細情報、「アクティビティ検証の呼び出し」を参照してください。

オーバーロード グループの使用

オーバーロード グループには、あるアクティビティ内で有効である引数の組み合わせを示すメソッドが用意されています。引数は 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 つある引数グループの 1 つを使用して場所を指定できます。引数の有効な組み合わせを指定するには、3 つのオーバーロード グループを定義します。G1 には LatitudeLongitude の引数があります。G2 には StreetCity、および State があります。G3 には StreetZip があります。Name も必須の引数ですが、オーバーロード グループには含まれません。このアクティビティを有効にするには、1 つのオーバーロード グループのみから、すべての引数をバインドすると共に、Name をバインドする必要があります。

オーバーロード グループを別のオーバーロード グループのサブセットまたは等価セットにすることはできません。このルールの唯一の例外は、RequiredArgumentfalse である引数だけを格納しているサブセットです。複数のオーバーロード グループが重なることはできます。しかし、一方か両方のオーバーロード グループの必須引数すべてがグループの積集合に含まれると、エラーになります。オーバーロード グループ内の RequiredArgument 引数すべてがバインドされている場合、そのグループはバインドされていると見なされます。グループに RequiredArgument 引数がなく、1 つ以上の引数がバインドされている場合、そのグループはバインドされていると見なされます。複数あるグループのうち、1 つもバインドされていない場合は、エラーになります。ただし、1 つのオーバーロード グループに RequiredArgument 引数が 1 つもない場合を除きます。複数のオーバーロード グループの RequiredArgument 引数をバインドすることはできません。複数のオーバーロード グループをバインドすると、エラーになります。つまり、1 つのオーバーロード グループの必須引数すべてがバインドされ、かつ別のオーバーロード グループの任意の引数もバインドされると、エラーになります。