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 参数的情况下执行此活动,它会按预期工作(正确设置了结果)。
但是如果我使用设计器添加一个变量,那么我将变量绑定到 Captured 参数这个错误弹出窗口:

不能使用“System.String”类型的参数。确保它在活动中声明。

执行此行时抛出异常:

this.Captured.Set(context, match.Value);

有人知道为什么我不能设置参数吗?
我还读到我不应该测试 Captured 是否为空,运行时应该自动设置默认值。但是如果我不测试,当我没有将变量绑定到参数时,我有一个 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 回答
1

当我在添加后调用 base.CachMetadata(metadata) 时,我的问题就消失了。尝试:

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

您想在添加后执行此操作,因为您希望基类在您调用它时知道您添加了什么。我认为基类使用反射自动为您完成 Damir Arh 的回答。这样,您不必在每次添加或修改属性时都添加或修改所有代码。如果你有很多属性,它会很快变得很痛苦。

于 2018-05-11T06:48:25.773 回答