WF: Workflow Designer: List of InArgument added dynamically : 如何在工作流执行期间获取价值

WF: Workflow Designer: List of InArgument added dynamically : How to get value during workflow execution

我构建了一个允许输入电子邮件列表的工作流设计器 addresses.Each 列表中的电子邮件需要是 InArgument(Of String),以便它们可以单独 edited/added 使用变量。

在我的 Activity 上,我有一个 属性 声明如下:

Public Property [To] As ObservableCollection(Of InArgument(Of String))

我的设计器已连接并正确填充此集合。

但是在执行过程中,我不知道如何为添加的每个 InArgument 获取 运行 时间值。

当我们执行工作流并对添加到列表中的每个 InArgument 进行迭代时,我尝试获取如下所示的值但失败了:

For Each toAddress As InArgument(Of String) In Me.To.ToList()
            Dim emailToAddress As String = toAddress.Get(_Context)          
Next

我们得到的错误是 “The argument of type '<type>' cannot be used. Make sure that it is declared on an activity”,在我的例子中类型是一个字符串...

我们得到的错误是有道理的,因为我们没有在 activity 上声明一个 属性,因为它是动态添加到列表中的,因此无法使用显示的语法获取值以下:

The_Property_Name.Get(_Context)

有人可以帮忙吗?我似乎找不到任何东西。我应该采用不同的方法吗?

我想通了,所以我会回答我自己的问题!我们需要做的就是通过重写 activity 上的 CacheMetadata() 方法将集合项显式添加到元数据中。然后,这使其可用于工作流上下文。

首先我们将它们添加到上下文中:

   Protected Overrides Sub CacheMetadata(ByVal metadata As CodeActivityMetadata)
        MyBase.CacheMetadata(metadata)

        Dim i As Integer = 0
        For Each item As InArgument(Of String) In Me.To
            Dim runTimeArg As RuntimeArgument = New RuntimeArgument("TO" & i.ToString(), item.ArgumentType, item.Direction, False)
            metadata.Bind(item, runTimeArg)
            metadata.AddArgument(runTimeArg)
            i = i + 1
        Next

    End Sub

然后执行的时候,我们得到的值是这样的

   For Each item As InArgument(Of String) In Me.To
            Dim email As String = _Context.GetValue(item)
        Next