workflow-foundationworkflow-foundation-4

Custom WF4 Activity with OutArgument and Assign Activity


I am trying to write a custom activity by composing standard Activities, one of which is an Assign activity which is responsible for assigning a string value to an OutArgument, called 'TextOut', which I have defined on my custom Activity. The idea is that the workflow author that uses this custom Activity defines a variable in the Workflow and maps this to the TextOut OutArgument of my custom Activity. I'd like to achieve this with an iterative approach, since I have a requirement to dynamically create pick branches at runtime. I have left out this code to simplify my question.

The code for the Activity is shown below. This is probably not how it should be done, since it doesn't work :) The workflow which uses this Activity throws a validation error: "Value for a required activity argument 'To' was not supplied".

I'd like to get some advice on how to get my OutArgument working with an Assign child activity (so without calling .Set on my OutArgument).

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;
    }
}

Solution

  • Try using a ArgumentReference in your Assign activity like this:

    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;
        }
    }