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

use*_*925 2 c# arguments workflow-activity default-value workflow-foundation-4

在为重新托管的工作流设计器编写自定义活动时,它给出了一个错误,如果我没有,那么必需参数需要一个值,所以我使用如下所示的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; }
Run Code Online (Sandbox Code Playgroud)

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

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

无法启动工作流程.

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

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

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

谢谢你的帮助

Joa*_*oao 5

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

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

public class MyCodeActivity : CodeActivity
{
    public MyCodeActivity()
    {
        JobStatus = "All";
    }
}
Run Code Online (Sandbox Code Playgroud)

或通过访问者强制一个值.像这样的东西:

private InArgument<string> text = "All";

[RequiredArgument]
public InArgument<string> Text
{
    get { return text ?? "All"; }
    set { text = value; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    Console.WriteLine(text);
}
Run Code Online (Sandbox Code Playgroud)