从WF 4活动动态设置外部范围内的变量

时间:2010-12-02 22:17:55

标签: workflow-foundation workflow-foundation-4

如何在.NET 4下的Windows Workflow Foundation活动中动态设置父作用域的变量值?

尝试失败(在Sequence上有一个名为Test的int变量的工作流上删除Sequence活动):

public sealed class CodeActivity1 : NativeActivity
{
    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        _locationReferences =
            metadata.Environment.GetLocationReferences().ToList();

        base.CacheMetadata(metadata);
    }

    protected override void Execute(NativeActivityContext context)
    {
        LocationReference locationReference =
            _locationReferences.Find(
                x => x.Name == "Test" && x.Type == typeof (int));

        if (locationReference != null)
        {
            Console.WriteLine(
                locationReference.Name + " " + locationReference.Type);

            // Blows up here.
            Location location = locationReference.GetLocation(context);
            location.Value = 5;
        }
    }

    private List<LocationReference> _locationReferences;
}

这导致:

  

System.InvalidOperationException是   未按用户代码处理
  消息=活动'1.2:CodeActivity1'   无法访问此变量,因为它   在活动范围内宣布   '1.1:序列'。一项活动只​​能   访问自己的实现   变量

确实找到了变量;它无法获得或设定其价值。

变量名称(上例中的“Test”)直到运行时才会知道。

1 个答案:

答案 0 :(得分:6)

处理此问题的常规方法是定义OutArgument,并在工作流设计器中将OutArgument绑定到您的变量。在活动中,您只使用参数。使用NativeActivity为您提供名为Result的OutArgument,但只添加OUtArgument属性就可以了。

另一个好处是你不需要知道“魔术”变量名来存储结果。

更新,因为以下评论中的代码无法读取。

尝试在爆炸线之前添加以下内容:

var pi = context.GetType().GetProperty("AllowChainedEnvironmentAccess", BindingFlags.NonPublic | BindingFlags.Instance); 
pi.SetValue(context, true, null); 

完全不受支持,请谨慎使用: - )