我尝试使用以下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
。
答案 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};