Workflow Foundation中自定义活动的必需参数的默认值

时间:2014-01-20 18:36:02

标签: c# arguments workflow-foundation-4 default-value workflow-activity

在为重新托管的工作流设计器编写自定义活动时,它给出了一个错误,如果我没有,那么必需参数需要一个值,所以我使用如下所示的null或“ALL” ”。它不接受null或“ALL”或其他任何默认参数。请注意,我的必需参数是string类型。

[RequiredArgument]
[DefaultValue(null)]
[Description(@"The status of the job to perform")]
public InArgument<string> JobStatus { get; set; }

[RequiredArgument]
[DefaultValue("All")]
[Description(@"The status of the job to perform")]
public InArgument<string> JobStatus { get; set; }

运行工作流时出现错误消息:

  

工作流程控制台:启动工作流程...

     

无法启动工作流程。

     

消息:无法启动工作流DynamicActivity。

     

异常消息:处理工作流树时遇到以下错误:   'DynamicActivity':活动'1:DynamicActivity'的私有实现具有以下验证错误:未提供所需活动参数'JobStatus'的值。

     

堆栈跟踪:在System.Activities.Validation.ActivityValidationServices.ThrowIfViolationsExist(IList`1 validationErrors)      在System.Activities.Hosting.WorkflowInstance.ValidateWorkflow(WorkflowInstanceExtensionManager extensionManager)      在System.Activities.Hosting.WorkflowInstance.RegisterExtensionManager(WorkflowInstanceExtensionManager extensionManager)      在System.Activities.WorkflowApplication.EnsureInitialized()      在System.Activities.WorkflowApplication.Enqueue(InstanceOperation操作,布尔推送)      在System.Activities.WorkflowApplication.WaitForTurn(InstanceOperation操作,TimeSpan超时)      在System.Activities.WorkflowApplication.InternalRun(TimeSpan timeout,Boolean isUserRun)      在System.Activities.WorkflowApplication.Run()

感谢您的帮助

1 个答案:

答案 0 :(得分:5)

工作流运行时和工作流设计器都不会查看DefaultValueAttribute。搜索属性需要反映,这可能会对性能造成代价。而且这不是属性的目的。

无论如何,您可以使用默认值初始化变量。在构造函数上,例如:

public class MyCodeActivity : CodeActivity
{
    public MyCodeActivity()
    {
        JobStatus = "All";
    }
}

或通过访问者强制一个值。像这样:

private InArgument<string> text = "All";

[RequiredArgument]
public InArgument<string> Text
{
    get { return text ?? "All"; }
    set { text = value; }
}

这些是不同的方法,使用适合您想要的行为的方法。在这两种情况下,都可以通过XAML修改值,因此对运行时的小检查可能会很好:

protected override void Execute(CodeActivityContext context)
{
    string text = context.GetValue(this.Text);
    if (text == null) 
    {
        text = "All";
    }

    Console.WriteLine(text);
}