共用方式為


必要引數與多載群組

您可以設定活動,讓繫結活動所需的某些引數有效,以便用於執行。 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 包含 StreetZipName 也是必要引數,但不是多載群組的一部分。 若要使這個活動有效,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 引數。

  • 繫結多個多載群組 (也就是說,一個多載群組中所需的所有引數皆已繫結,而且其他多載群組中所有引數也已繫結) 是錯誤的。