【发布时间】:2012-07-18 23:41:45
【问题描述】:
我正在尝试使用应用正则表达式并在匹配时返回布尔值的复合自定义活动。 模式是在设计时编码的东西。 源文本来自一个活动。此活动也在设计时指定(我制作了一个允许将活动作为源删除的活动设计器)
但我还需要返回与表达式匹配的子字符串,所以我添加了一个 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...
编辑:
我想添加有关工作流程本身的更多信息。我在another topic 中读到它可能是VS。在这里,我只想指定我正在使用重新托管的设计器来创建工作流(以及 not VS)。然后将工作流作为 XML 保存在数据库中。
当我需要启动一个新的工作流时,我会读取数据库,使用 XamlService.Load 并运行创建的工作流。
【问题讨论】:
标签: workflow-foundation-4 workflow-foundation workflow-activity