如何在c#中按类的动态字段名搜索List <classtype>

时间:2017-05-16 08:05:20

标签: c# entity-framework linq

这是我的问题,所以我解决了它,然后决定与大家分享。

我有一份我的司机类列表。

我从DB加载数据,然后在datagridview中显示:

 List<driver> list = DriverList();
 dgvListDrivers.DataSource = list;

在组合框中加载字段名称:

List<ColNameText> l = new List<ColNameText>();
foreach (DataGridViewColumn item in dgvListDrivers.Columns)
{
    ColNameText cnt=new ColNameText();
    cnt.colname=item.Name;
    cnt.displaytext=item.HeaderText;
    l.Add(cnt);
}
comboBoxEx1.DataSource=l.ToList();
comboBoxEx1.DisplayMember = "displaytext";
下面的

是ColNameText Class Definaton:

class ColNameText
    {
        public string colname { get; set; }
        public string displaytext { get; set; }
    }

现在我希望能够按驱动程序类属性搜索列表。

我搜索了许多解决方案,但它们并不是我想要的方式。

2 个答案:

答案 0 :(得分:1)

这看起来像LINQ表达式可以帮助:

static List<T> FindWhereMemberContains<T>(this List<T> list,
    string memberName, string value)
{
    var p = Expression.Parameter(typeof(T));
    var lambda = Expression.Lambda<Predicate<T>>(Expression.Call(
        Expression.Call(Expression.PropertyOrField(p, memberName), "ToString", null),
        "Contains", null, Expression.Constant(value, typeof(string))), p);
    return list.FindAll(lambda.Compile());
}

使用:

dgvListDrivers.DataSource = list.FindWhereMemberContains(p.colname, txtSearch.Text);

对于大型列表,这将比原始反射快得多;对于小型列表,基本反射(没有元编程开销)可能会更快 - 您需要进行测试。

非表达但仍然不太糟糕的版本可能是:

static List<T> FindWherePropertyContains<T>(this List<T> list,
    string propertyName, string value)
{
    var property = (Func<T, object>)Delegate.CreateDelegate(typeof(Func<T, object>),
        typeof(T).GetProperty(propertyName).GetGetMethod());
    return list.FindAll(x => property(x).ToString().Contains(value));
}

答案 1 :(得分:0)

以下是您在列表中搜索的最简单方法。 这发生在textbox_textchange事件中:

*[local-name()='bind']