2010-12-02 3 views
2

.NET Workflow Foundationアクティビティの親スコープから変数の値を動的に設定する方法はありますか。外部スコープの変数をWF 4アクティビティから動的に設定する

(配列がTestというint型の変数を有するワークフロー上の配列の活性のドロップ)失敗した:

public sealed class CodeActivity1 : NativeActivity 
{ 
    protected override void CacheMetadata(NativeActivityMetadata metadata) 
    { 
     _locationReferences = 
      metadata.Environment.GetLocationReferences().ToList(); 

     base.CacheMetadata(metadata); 
    } 

    protected override void Execute(NativeActivityContext context) 
    { 
     LocationReference locationReference = 
      _locationReferences.Find(
       x => x.Name == "Test" && x.Type == typeof (int)); 

     if (locationReference != null) 
     { 
      Console.WriteLine(
       locationReference.Name + " " + locationReference.Type); 

      // Blows up here. 
      Location location = locationReference.GetLocation(context); 
      location.Value = 5; 
     } 
    } 

    private List<LocationReference> _locationReferences; 
} 

これはもたらす:

のSystem.InvalidOperationExceptionが ましたはアクティビティの範囲で宣言されているため、この変数にアクセスすることはできません'1.1:シーケンス'。アクティビティは 自身の実装 の変数にアクセスすることしかできません。

変数が見つかりません。その値を取得または設定することはできません。

変数名(上記の例では "Test")は、実行時まで認識されません。

答えて

6

これを処理する通常の方法は、OutArgumentを定義し、ワークフローデザイナでOutArgumentを変数にバインドすることです。このアクティビティでは、引数だけを使用します。 NativeActivityを使用すると、Resultという名前のOutArgumentが得られますが、OUtArgumentのプロパティを追加するだけで問題ありません。

もう一つの利点は、あなたが結果を格納する「マジック」変数名を知っている必要はありませんです。

を更新以下のコメントでコードが読めないので。

を増やしてみてください、それが吹くだけで行の前に次のよう

var pi = context.GetType().GetProperty("AllowChainedEnvironmentAccess", BindingFlags.NonPublic | BindingFlags.Instance); 
pi.SetValue(context, true, null); 

は完全に私は、クライアントがのハードコードされた知識を持っていない要件がある

+0

:-)注意して使用しますので、サポートされていませんワークフロー私たちはBPMに慣れています。名前を渡し、フィールドを初期化し、プロセスの実行中にフィールドのリストを取得して設定するなど、プロセスを作成することができます。より柔軟で、発見可能で、デカップリングされています。実行時の安全性のコストBPMからWFへの移行は、動的に型付けされた言語から静的に型付けされた言語に移行するようなものです。私は2つの選択肢があると思います:Dictionary 型の変数でそれを偽ったり、WSDLに問い合わせます。 – TrueWill

+0

私はあなたの質問を完全に誤解したと思います。私は、特定のワークフロー変数を使用しようとしている場所で、WSDLおよびWCFクライアントとは関係がないという印象を受けました。 WCF要求パラメータは、受信パラメータのみの結果です。どのように結果を内部ワークフロー変数に結びつけ、あるいは値を無視するかは、クライアントアプリケーションにとって完全に透過的です。 – Maurice

+0

@Maurice - 私は例を単純にしてみたかった。 Receiveパラメータは、名前と値のペアの集合を持つ固定型であることが必要でした。呼び出されると、一致する名前を持つスコープの変数を動的に更新します。 – TrueWill

関連する問題