如何在.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”)直到运行时才会知道。
答案 0 :(得分:6)
处理此问题的常规方法是定义OutArgument,并在工作流设计器中将OutArgument绑定到您的变量。在活动中,您只使用参数。使用NativeActivity为您提供名为Result的OutArgument,但只添加OUtArgument属性就可以了。
另一个好处是你不需要知道“魔术”变量名来存储结果。
更新,因为以下评论中的代码无法读取。
尝试在爆炸线之前添加以下内容:
var pi = context.GetType().GetProperty("AllowChainedEnvironmentAccess", BindingFlags.NonPublic | BindingFlags.Instance);
pi.SetValue(context, true, null);
完全不受支持,请谨慎使用: - )