鉴于有一个工作流程基金会4个运行时间,正在一个网站开展工作。
我们需要找到工作流程的论据,让用户看到编辑进入辩论。 因为我们需要所有有名称、类型和违约价值的论点,以及说明是否需要提出论据。
工作流程作为XAML档案储存。
如何做到这一点? 这些数据似乎出现在活动元数据中,在工作流程之外,这种元数据似乎并非瓦.。 此外,工作流程发动机模型服务为设计师,并有许多间接费用。
检索这一信息的任何容易途径?
鉴于有一个工作流程基金会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);
}
}
}
如果没有完全的保证,你必须做一些检查。