具有OutArgument和Assign活动的自定义WF4活动

时间:2010-11-25 17:19:33

标签: workflow-foundation workflow-foundation-4

我试图通过编写标准活动来编写自定义活动,其中一个是一个Assign活动,它负责将一个字符串值赋给一个名为'TextOut'的OutArgument,我在自定义Activity上定义了它。我们的想法是,使用此自定义Activity的工作流作者在工作流中定义一个变量,并将其映射到我的自定义Activity的TextOut OutArgument。我想用迭代方法实现这一点,因为我需要在运行时动态创建pick分支。我遗漏了这段代码来简化我的问题。

活动的代码如下所示。这可能不是应该如何完成的,因为它不起作用:)使用此Activity的工作流会抛出验证错误:“未提供所需活动参数'To'的值。”

我想获得一些关于如何让我的OutArgument使用Assign子活动的建议(所以不要在我的OutArgument上调用.Set)。

public sealed class OutArgActivity : Activity
{
    public OutArgument<string> TextOut { get; set; }

    public OutArgActivity()
    {
        Assign assign = new Assign {
            To = this.TextOut,
            Value = new InArgument<string>(
                env => "this is my custom return value")
        };

        Sequence sequence = new Sequence();
        sequence.Activities.Add(assign);

        this.Implementation = () => sequence;
    }
}

2 个答案:

答案 0 :(得分:8)

尝试在Assign活动中使用ArgumentReference,如下所示:

public sealed class OutArgActivity : Activity
{
    public OutArgument<string> TextOut { get; set; }

    public OutArgActivity()
    {
        Assign<string> assign = new Assign<string>
        {
            To = new ArgumentReference<string>("TextOut"),
            Value = new InArgument<string>(
                env => "this is my custom return value")
        };

        Sequence sequence = new Sequence();
        sequence.Activities.Add(assign);

        this.Implementation = () => sequence;
    }
}

答案 1 :(得分:0)

如果您不想使用魔术弦,可以用这种方式。

public sealed class OutArgActivity : Activity
{
    public OutArgument<string> TextOut { get; set; }

    public OutArgActivity()
    {
        Assign<string> assign = new Assign<string>
        {
            To = new OutArgument<string>(ctx => TextOut.Get(ctx)),
            Value = new InArgument<string>(
                env => "this is my custom return value")
        };

        Sequence sequence = new Sequence();
        sequence.Activities.Add(assign);

        this.Implementation = () => sequence;
    }
}

这似乎很不直观,但是由于OutArgument<>的构造函数的参数是Expression,因此可以将其转换为位置引用。正是这样。