【问题标题】:Writing ProcessParameters during build在构建期间编写 ProcessParameters
【发布时间】:2013-12-18 14:03:41
【问题描述】:
【问题讨论】:
标签:
tfs
build
workflow-foundation-4
【解决方案1】:
按照here 的建议,我设法通过保留WorkflowInstanceProxy 来做到这一点:
public class WriteProcessParameters : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
WorkflowInstanceProxy proxy = context.GetExtension<WorkflowInstanceInfo>().GetProxy();
Activity root = proxy.WorkflowDefinition;
Dictionary<string, ProcessParameter> processParams = WorkflowHelpers.GetProcessParameters(root);
// Serialize processParams somehow...
}
protected override void CacheMetadata(CodeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddDefaultExtensionProvider<WorkflowInstanceInfo>(() => new WorkflowInstanceInfo());
}
private class WorkflowInstanceInfo : IWorkflowInstanceExtension
{
private WorkflowInstanceProxy m_proxy;
public IEnumerable<object> GetAdditionalExtensions() { yield break; }
public void SetInstance(WorkflowInstanceProxy instance) { this.m_proxy = instance; }
public WorkflowInstanceProxy GetProxy() { return m_proxy; }
}
}
这在我的玩具测试中有效,但在实际工作流程中无效(不知道为什么)。所以我最终读取了属性,如下所示:
public InArgument<string> Filename { get; set; }
protected override void Execute(CodeActivityContext context)
{
var propDescriptors = context.DataContext.GetProperties().Cast<PropertyDescriptor>();
var props = new Dictionary<string, object>();
foreach (var propDesc in propDescriptors.OrderBy(p => p.Name))
{
object value = propDesc.GetValue(context.DataContext);
if (value == null)
{
var converter = TypeDescriptor.GetConverter(propDesc.PropertyType);
if (converter.CanConvertTo(propDesc.PropertyType))
{
value = converter.ConvertTo(value, propDesc.PropertyType); // Known case: null string
}
else
{
continue; // Known case: RunTestParameters
}
}
else
{
if (!value.GetType().IsVisible || !value.GetType().IsSerializable)
{
continue;
}
}
props.Add(propDesc.Name, value);
}
File.WriteAllText(Filename.Get(context), WorkflowHelpers.SerializeProcessParameters(props));
}