型のプロパティを取得するには、リフレクションに頼ることができます。クラスのプロパティのリストを取得する方法を参照してください。
そこから、式ツリーを使用して動的述語を作成できます。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
。これは、プロジェクトで使用するものです。