1

我正在使用 Linq 过滤一些东西,有时我需要使用反射来获取值。这是示例:

//...
PropertyType[] properties = myType.GetProperties();
var filtered = properties.Where(p=>p.PropertyType==typeof(MyMetaData) 
&& ((MyType)p.GetValue(obj)).Name=="name"
&& ((MyType)p.GetValue(obj)).Length==10
).ToList();
//...

在我的示例中,我不止一次使用 GetValue() 方法。如果我可以使用变量来存储它,有没有办法?我认为这将有助于提高性能。

4

2 回答 2

7

variable看起来像在 a中包含一些LINQ我们必须使用expression query, not method query,像这样:

var filtered = (from x in properties
               let a = (x.PropertyType is MyType) ? (MyType) x.GetValue(obj) : null
               where a != null && a.Name == "name" && a.Length == 10).ToList();

我认为这也适用于method query一些Select

var filtered = properties.Select(p=> new {p, a = (p.PropertyType is MyType) ? (MyType) p.GetValue(obj) : null})
                         .Where(x=>x.a != null && x.a.Name == "name" && x.a.Length == 10)
                         .Select(x=>x.p).ToList();
于 2013-08-13T15:42:30.480 回答
5

类似以下的内容应该适用于方法表达式(lambda 语法)

    var filtered = properties.Where(p => 
        {
            if(!p.PropertyType is MyMetaData)
            {
                return false;
            }
            var item = (MyType) p.GetValue(obj);
            return item.Name == "name"
                && item.Length == 10
        }
    ).ToList();
于 2013-08-13T15:45:58.450 回答