正規表現を適用し、一致する場合はブール値を返す複合カスタム アクティビティを使用しようとしています。パターンは、設計時にエンコードされたものです。ソース テキストはアクティビティから取得されます。このアクティビティは設計時にも指定されます (アクティビティをソースとしてドロップできるアクティビティ デザイナーを作成しました)。
しかし、式に一致する部分文字列も返す必要があるため、一致する文字列を取得するために OutArgument を追加し、文字列をキャプチャしました。
コードは次のとおりです。
public class RegularExpression : NativeActivity<bool>
{
[RequiredArgument]
public string Pattern { get; set; }
public OutArgument<string> Captured { get; set; }
[RequiredArgument]
public Activity<string> RetrieveTextActivity { get; set; }
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
metadata.AddChild(this.RetrieveTextActivity);
}
protected override void Execute(NativeActivityContext context)
{
if (this.RetrieveTextActivity != null)
context.ScheduleActivity<string>(this.RetrieveTextActivity, this.onRetrieveComplete);
}
private void onRetrieveComplete(NativeActivityContext context, ActivityInstance completedInstance, string result)
{
var regexp = new Regex(this.Pattern);
var match = regexp.Match(result);
this.Result.Set(context, match.Success);
if (this.Captured != null)
this.Captured.Set(context, match.Value);
}
}
Captured 引数に変数をバインドせずにこのアクティビティを実行すると、期待どおりに動作します (Result が正しく設定されます)。
しかし、デザイナーを使用して変数を追加すると、その変数を Captured 引数にバインドすると、次のエラー ポップアップが表示されます。
タイプ 'System.String' の引数は使用できません。アクティビティで宣言されていることを確認してください。
次の行を実行すると、例外がスローされます。
this.Captured.Set(context, match.Value);
誰かが引数を設定できない理由を知っていますか?
Captured が null であることをテストするべきではないことも読みました。ランタイムは自動的にデフォルト値を設定する必要があります。しかし、テストしないと、変数を引数にバインドしないと NullReference になります...
編集:
ワークフロー自体に関する情報を追加したいと思います。別のトピックで、VSである可能性があることを読みました。ここでは、再ホストされたデザイナーを使用して ( VS ではなく)ワークフローを作成していることを指定したいだけです。その後、ワークフローは XML としてデータベースに保存されます。
新しいワークフローを開始する必要がある場合は、データベースを読み取り、XamlService.Load を使用して、作成したワークフローを実行します。