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()
谢谢你的帮助
工作流运行时和工作流设计器都不会考虑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)