1

正規表現を適用し、一致する場合はブール値を返す複合カスタム アクティビティを使用しようとしています。パターンは、設計時にエンコードされたものです。ソース テキストはアクティビティから取得されます。このアクティビティは設計時にも指定されます (アクティビティをソースとしてドロップできるアクティビティ デザイナーを作成しました)。

しかし、式に一致する部分文字列も返す必要があるため、一致する文字列を取得するために 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 を使用して、作成したワークフローを実行します。

4

2 に答える 2

3

で引数を宣言するとエラーはなくなりますCacheMetadataか?

protected override void CacheMetadata(NativeActivityMetadata metadata)
{
    metadata.AddChild(this.RetrieveTextActivity);

    RuntimeArgument argument = new RuntimeArgument("Captured", typeof(string), ArgumentDirection.Out);
    metadata.Bind(this.Captured, argument);
    metadata.AddArgument(argument);

}

編集:私は速すぎました。上記のコードがコンパイルされ、うまくいけば問題が解決するはずです。

于 2012-07-19T04:57:22.113 に答える