2012-01-11 9 views
2

Webサイトと連携しているWorkflow Foundation 4ランタイムがあります。ワークフローの引数を取得します(デフォルト値)?

ユーザーに引数を入力するエディタを表示するには、ワークフローの引数を取得する必要があります。そのためには、名前、型、デフォルト値、引数が必要かどうかを示すすべての引数が必要です。

ワークフローはXAMLファイルとして保存されます。

どうすればよいですか?データは、ワークフロー外では使用できないように見えるアクティビティメタデータにあるようです。さらに、Workflow Engine ModelServiceはDesigner用であり、オーバーヘッドが大きくなります。

この情報を簡単に取得する方法はありますか?

答えて

0

DynamicActivityとして読み込み、それをしては反復 UPDATE

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

プロパティPropertiesオーバー:不在デフォルト値一部

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); 
     } 
    } 
} 

完全に保証されていない、あなたがしなければならないいくつかのチェックがあります。

+0

*アクティビティ*から*ダイナミックアクティビティ*へのキャストは無効です。 – Joao

+0

本当ですか? DynamicActivity:アクティビティ このアクティビティは、あなたのActivityBuilderを通じて作成されたワークフローデザイナーですか? –

+0

コードによって作成された* CustomCodeActivity *の場合はどうなりますか?そのキャストは常に有効ではありません。 – Joao

2

私はすでに同様のことをしています。一般的なアプローチが必要な場合は、リフレクションが最良の(そして唯一の)オプションになるかもしれません。

// 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; 
} 

この方法では、引数の名前だけでなく、引数の属性によって保持される他の情報も取得できます。たとえば、私はを介してユーザーフレンドリーな名前を引数として指定します[説明]属性(MyPropertyNameユーザーの代わりに「My Property Name」が表示されます)。

:あなたはあなたの活動がActivityBuilderDynamicActivityであることを確認できた場合、それらの両方に使用できるProperties性質を持っていますが、原理は同じです。

+0

+1。 DynamicActivityProperty(これはよく知られていて、それらの情報をすべて保持しています)を再利用して、ActivityBuilderまたはDynamicActivityがあるかどうかをチェックしてプロパティpropを返し、その他の場合はリフレクションを使用して小道具を取得するメソッドを作成できます。 ;] –

+0

もちろん、それはオプションです。私の推測では、*プロパティ*プロパティもシーンの裏側の反射を使用しています。 * DynamicActivity *は[ICustomTypeDescriptor](http://msdn.microsoft.com/en-us/library/system)を実装しています。componentmodel.icustomtypedescriptor.aspx)。 – Joao

関連する問題