English 中文(简体)
恢复工作流程的标语(带有违约值)?
原标题:Retrieve Arguments of a Workflow (with default values)?
  • 时间:2012-01-11 17:18:01
  •  标签:

鉴于有一个工作流程基金会4个运行时间,正在一个网站开展工作。

我们需要找到工作流程的论据,让用户看到编辑进入辩论。 因为我们需要所有有名称、类型和违约价值的论点,以及说明是否需要提出论据。

工作流程作为XAML档案储存。

如何做到这一点? 这些数据似乎出现在活动元数据中,在工作流程之外,这种元数据似乎并非瓦.。 此外,工作流程发动机模型服务为设计师,并有许多间接费用。

检索这一信息的任何容易途径?

问题回答

我已经做了类似的事情。 如果你想采取通用做法,那么反思可能是你的最佳(仅是)选择。

// Just an holder for InArgument informations
class InArgumentInfo
{
    public string InArgumentName { get; set; }
    public string InArgumentDescription { get; set; }
    public bool InArgumentIsRequired { get; set; }
}

static ICollection<InArgumentInfo> GetInArgumentsInfos(Activity activity)
{
    var properties = activity.GetType()
        .GetProperties()
        .Where(p => typeof(InArgument).IsAssignableFrom(p.PropertyType))
        .ToList();

    var argumentsCollection = new Collection<InArgumentInfo>();

    foreach (var property in properties)
    {
        var descAttribute = property
            .GetCustomAttributes(false)
            .OfType<DescriptionAttribute>()
            .FirstOrDefault();

        string description = descAttribute != null && !string.IsNullOrEmpty(descAttribute.Description) ?
            descAttribute.Description :
            string.Empty;

        bool isRequired = property
            .GetCustomAttributes(false)
            .OfType<RequiredArgumentAttribute>()
            .Any();

        argumentsCollection.Add(new InArgumentInfo
        {
            InArgumentName = property.Name,
            InArgumentDescription = description,
            InArgumentIsRequired = isRequired
        });
    }

    return argumentsCollection;
}

This way you can not only retrieve the argument s name but also other information hold by the argument s attributes. For example I choose to give argument an user-friendly name through [Description] attribute (eg. instead of MyPropertyName user sees "My Property Name").

Note: if you can ensure that you activity is an ActivityBuilder or DynamicActivity they both have Properties property that you can use, but the principle is the same.

将其视作动态活动,并在<条码>上公布

var dynamicActivity = ActivityXamlServices.Load(foo) as DynamicActivity
foreach(DynamicActivityProperty prop in dynamicActivity.Properties)
{
   // ...
}

UPDATE: Missed default value part

foreach (var prop in dynamicActivity .Properties)
{
    object defaultValue;
    if (prop.Value == null)
    {
        defaultValue = null;
    }
    else
    {
        Type genericTypeDefinition = prop.Type.GetGenericTypeDefinition();
        if (genericTypeDefinition == typeof(InArgument<>) || genericTypeDefinition == typeof(InOutArgument<>))
        {
            var valueProp = prop.Value.GetType().GetProperty("Expression", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.DeclaredOnly);
            var expression = valueProp.GetValue(prop.Value, null);

            var expressionValueProp = expression.GetType().GetProperty("Value");
            defaultValue = expressionValueProp.GetValue(expression, null);
        }
    }
}

如果没有完全的保证,你必须做一些检查。





相关问题
热门标签