【问题标题】:Custom WF4 Activity with OutArgument and Assign Activity具有 OutArgument 和分配活动的自定义 WF4 活动
【发布时间】:2010-11-25 17:19:33
【问题描述】:

我正在尝试通过编写标准活动来编写自定义活动,其中一个是分配活动,它负责将字符串值分配给名为“TextOut”的 OutArgument,这是我在自定义活动中定义的。想法是使用此自定义 Activity 的工作流作者在 Workflow 中定义一个变量并将其映射到我的自定义 Activity 的 TextOut OutArgument。我想通过迭代方法来实现这一点,因为我需要在运行时动态创建选择分支。我省略了这段代码以简化我的问题。

Activity 的代码如下所示。这可能不应该这样做,因为它不起作用 :) 使用此 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;
    }
}

【问题讨论】:

    标签: workflow-foundation workflow-foundation-4


    【解决方案1】:

    尝试在您的分配活动中使用 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;
        }
    }
    

    【讨论】:

    • 谢谢莫里斯。你刚刚拯救了我的一天;)。
    【解决方案2】:

    如果你不想使用魔术字符串,你可以这样做。

    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&lt;&gt; 的构造函数的参数是Expression,因此可以将其转换为位置引用。这正是发生的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多