1

WindowsForm アプリケーションで検索フォームを作成しています。

public partial class SearchForm<T>()
{
   ....
}

実行時に、プロパティの種類に基づいていくつかのコントロールを作成しTます。たとえば、次Tの場合Order:

public class Order
{
   public string OrderNumber {get; set;}
   public decimal OrderWeight {get; set;}
}

検索フォームは次のようになります。

ここに画像の説明を入力

stringプロパティの場合は1つTextBox、数値プロパティの場合は2Controlつ(1つはFrom用、もう1つはTo用)

predicateまた、ユーザーが選択した条件を変数に入れたい:

Func<T, bool> predicate;

例えば

predicate = t => t.OrderNumber.Contains("ORDER-01") && 
                 t.OrderWeight >= 100 &&
                 t.OrderWeight <= 200;

私の質問は

  1. 型のすべてのプロパティを取得するにはどうすればよい<T>ですか?

  2. これを動的に作成するにはどうすればよいpredicateですか(条件を動的に相互に関連付けます)?

4

2 に答える 2

1

型のプロパティを取得するには、リフレクションに頼ることができます。クラスのプロパティのリストを取得する方法を参照してください。

そこから、式ツリーを使用して動的述語を作成できます。Expression<Func<MyClass, bool>> 述語を動的に作成する方法を参照してください。

しかし、より単純な (ただし、より多くのタイピングを必要とする) アプローチをお勧めします。

すべてTの で実装する必要があるインターフェイスを用意します。何かのようなもの:

 public interface Searchable
 {
      IEnumerable<ParamInfo> Params { get; }
      Func<string, decimal, decimal, bool> Predicate { get; }
 }

そしてParamInfoクラス:

public class ParamInfo
{
    public string LabelText { get; private set; }

    public Type EditControl { get; private set; }

    public Type DataType { get; private set; }

    public object DefaultValue { get; private set; }

    public bool Required { get; private set; }

    //etc. basically a good info class the decides how to draw gui
}

検索フォームは、

public partial class SearchForm<T> where T : Searchable
{
   ....
}

そしてポコ:

public class Order : Searchable
{
   public string OrderNumber {get; set;}
   public decimal OrderWeight {get; set;}

   public IEnumerable<ParamInfo> Params 
   {  
      get 
      { 
          return new List<ParamInfo> 
          {
              new ParamInfo(typeof(TextBox), typeof(string), "Enter value", true),
              new ParamInfo(typeof(TextBox), typeof(decimal), 0, true),
              new ParamInfo(typeof(TextBox), typeof(decimal), 0, true)
          }
      }  
   }

   public Func<string, decimal, decimal, bool> Predicate
   {  
      get 
      { 
          return (s, d1, d2) => OrderNumber.Contains(s) 
                             && OrderWeight >= d1 
                             && OrderWeight <= d2; //and so on, u get the idea.
      }  
   }

これにより、柔軟性が大幅に向上します。述語を動的に構築する代わりにParamInfo、各 のクラスに述語を直接アタッチできますT。これは、プロジェクトで使用するものです。

于 2013-06-16T08:16:45.953 に答える