要获取类型的属性,您可以依赖反射。请参阅如何获取类的属性列表?
从那里您可以使用表达式树来构建动态谓词。请参阅如何动态创建 Expression<Func<MyClass, bool>> 谓词?
但我建议采用更简单(但涉及更多打字)的方法。
有一个应该由你的所有T
s 实现的接口。就像是:
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
{
....
}
和 poco:
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.
}
}
这提供了更多的灵活性。您可以直接将谓词附加到每个s中的类,而不是动态构建谓词。这是我们在您的项目中使用的东西。ParamInfo
T