此Linq语句从何处获取所选值?

时间:2014-08-14 21:55:12

标签: c# .net linq

我尝试使用以下Linq-Statement:

private static void Test(object instance)
{
    PropertyInfo[] propertyInfos = instance.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)    
    var pis = from pi in
                  (from propertyInfo
                      in propertyInfos
                  select new {
                      PropertyInfo = propertyInfo,
                      Attribute = propertyInfo.GetCustomAttribute(typeof(Attribute))
                  })
              where pi.Attribute != null
              select pi;
    // End of test method
}

我认为必须有一种更简单的方法来做到这一点。 但是,Reflector告诉我这句话简化为:

private static void Test(object instance)
{
    var pis = from propertyInfo in instance.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)
        let Attribute = propertyInfo.GetCustomAttribute(typeof(Attribute))
        where Attribute != null
        select pi;
   // End of reflector output
}

现在我想知道pi来自哪里......

修改

如果我将以下行添加到原始代码中:

foreach (var item in pis)
    Debug.WriteLine(item.Attribute.ToString() + " " + item.PropertyInfo.Name);

它们在反射代码中看起来没有变化。似乎pi确实属于new { PropertyInfo, Attribute }类型,即使从未创建过实例。因此,无法选择propertyInfo

1 个答案:

答案 0 :(得分:3)

你正在使用的任何反射器似乎都有一个错误。 pi应为propertyInfo。但是说你的查询可以这样简化是正确的。

您的查询可以简化为:

var pis = from propertyInfo in instance.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)
    let attribute = propertyInfo.GetCustomAttribute(typeof(Attribute))
    where attribute != null
    select new {propertyInfo, attribute};