2011-10-24 14 views
1

汎用アクティビティをワークフローに追加するときにジェネリック型のピッカーによってユーザーに提示されるオプションを制限または変更する方法はありますか?カスタムNativeActivityでジェネリック型のオプションを制限する<T>

私たちのアプリケーションには動的ワークフローサポートが組み込まれており、関連するビジネスオブジェクトの値をワークフロー変数に読み込むための一連のカスタムアクティビティを構築しています。だから、今、私たちはそう、ReadDocumentProperty<T>SetItemProperty<T>

これらのビジネス・オブジェクト

のみ基本型(整数、浮動小数点、文字列、ブール値、日時、またはリスト)の一握りのいずれかにすることができ、ユーザー定義のプロパティセットが含まれているような活動を持っています.NETタイプのセット全体を顧客に公開して選択するのは意味がありません。さらに悪いことに、がほしいと思うものはがSystem.Double(請求書金額など)であり、デフォルトリストにさえありません。

このプロンプトを変更する方法はありますか?置換、フィルタリング、既定値の事前設定などがあり、引き続き一般的なカスタムアクティビティを使用できますか?

答えて

1

新しい一日、新しいアイデア。私は本当にこれを忘れてしまった。

あなたがデザイン時に検証をしたい場合は、それはこのような何かを行うには全く可能です:あなたはそれ独自のワークフローを設計するクライアントのための活動を利用可能にしている場合

public sealed class MyActivity<T> : NativeActivity<T> 
    { 
     protected override void CacheMetadata(NativeActivityMetadata metadata) 
     { 
      base.CacheMetadata(metadata); 

      if (typeof(T) != typeof(int) && 
       typeof(T) != typeof(bool) && 
       typeof(T) != typeof(DateTime) && 
       typeof(T) != typeof(decimal) && 
       typeof(T) != typeof(string)) 
      { 
       metadata.AddValidationError(
        "Generic must be 'int', 'DateTime', 'decimal' or 'string'"); 
      } 
     } 

     protected override void Execute(NativeActivityContext context) 
     { 
      // Execution logic 
     } 
    } 

これは完全に許容可能であるが。しかし、これは設計時の検証であることに注意してください。コードを使用してアクティビティを使用すると、完全にコンパイルされますが、実行時に検証/実行されると検証例外がスローされます。


ジェネリック活動のタイプを制約する唯一の方法は、あなたが他のgeneric type constraintを使用していただけのように、whereキーワードです。ダイアログは、すべてのタイプが、structをフィルタリングします

public sealed ReadDocumentProperty<T> : CodeActivity<T> 
    where T : struct 
{ 
    //... 
} 

:あなたはこのような何かを行う場合は、汎用型を選択しダイアログについて

。たぶんその方法System.Doubleがデフォルトリストに表示されますが、それはちょうど推測(テストしていない)ですが、もちろんそれに頼ることはできません。さらに、タイプを最初に選択した場合、そのタイプはデフォルトのリストにはないので、2回目にそのタイプが表示されます。

編集

私はこの男を理解することができます何のために彼はリフレクションを使用して、線形の近くにどこにもそれをやっての直接または文書化の方法ではありませんが、に「reduce the "browse for types" list」方法を見つけました。私が見ることができるのは、特定のアクティビティではなく、すべてのエディタのリストを減らすことです(そうでなければこれを忘れてください)

+0

私はジェネリックタイプを制約することを考えましたが、 (基本的にはint、bool、DateTime、10進数、および文字列) –

+0

あなたは正しいです。それは神の気持ちC#の限界です。とにかく、私の編集をチェックし、役立つかどうかを確認してください。 – Joao

+0

はい、私はそれを読んで、私はそれが線形、直接、または明らかにサポートされていないことに同意します:)私は別の方法を行った、私はちょうど私が欲しかったいくつかの種類の具体的なクラスを作ることに終わった。その汎用タイプのピッカーを変更するための「適切な」方法はないようです。 –

関連する問題