如何在泛型方法中反映lambda的属性?

时间:2011-11-25 10:41:53

标签: c# lambda expression

我需要为我的Repository反映lambda的属性,这里是代码:

public abstract class RestController<T> : Controller where T : class
{
    private readonly IRepository _db;
    private readonly string _identityProp;

    protected RestController(IRepository db, string identityProp)
    {
        _db=db;
        _identityProp = identityProp;
    }

    protected virtual void Delete(T item)
    {
        var value = item.GetType().GetProperty(_identityProp).GetValue(item, null);
        var items = _db.All<T>()
            .Where(i=>i.GetType().GetProperty(_identityProp)==val)
            .ToList();
        items.ForEach(x=>_db.Delete(x));
        _db.CommitChanges();
        return Json("success");
    }
}

但lambda的结果是一个空列表...请帮助,我做错了什么?

1 个答案:

答案 0 :(得分:2)

您在LINQ查询中缺少.GetValue(i, null)。目前,您正在将属性(value)的值与描述该属性的PropertyInfo进行比较。

正确的代码:

var items = _db.All<T>()
               .Where(i => i.GetType().GetProperty(_identityProp)
                                      .GetValue(i, null) == val)
               .ToList();

或者,更多以性能为导向:

var propertyInfo = item.GetType().GetProperty(_identityProp);
var value = propertyInfo.GetValue(item, null);
var items = _db.All<T>()
               .Where(i => propertyInfo.GetValue(i, null) == val)
               .ToList();