我正在尝试使用应用正则表达式并在匹配时返回布尔值的复合自定义活动。模式是在设计时编码的东西。源文本来自一个活动。此活动也在设计时指定(我制作了一个允许将活动作为源删除的活动设计器)
但是我还需要返回与表达式匹配的子字符串,所以我添加了一个 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 并运行创建的工作流。