我有一个类型t
,并且我想获得具有属性MyAttribute
的公共属性的列表。该属性使用AllowMultiple = false
标记,如下所示:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
目前我所拥有的是这样的,但我在想有一个更好的方法:
foreach (PropertyInfo prop in t.GetProperties())
{
object[] attributes = prop.GetCustomAttributes(typeof(MyAttribute), true);
if (attributes.Length == 1)
{
//Property with my custom attribute
}
}
我该如何改进这一点呢?如果这是一个复制品,我很抱歉,there...seems上有大量的反射线程,看起来这是一个相当热门的话题。
发布于 2010-02-18 00:09:52
var props = t.GetProperties().Where(
prop => Attribute.IsDefined(prop, typeof(MyAttribute)));
这避免了必须物化任何属性实例(即,它比GetCustomAttribute[s]()
更便宜。
发布于 2010-02-17 23:39:22
据我所知,没有比这更好的方式来使用反射库了。但是,您可以使用LINQ使代码更好一些:
var props = from p in t.GetProperties()
let attrs = p.GetCustomAttributes(typeof(MyAttribute), true)
where attrs.Length != 0 select p;
// Do something with the properties in 'props'
我相信这会帮助你以一种更易读的方式组织代码。
发布于 2010-02-17 23:43:11
总是有LINQ:
t.GetProperties().Where(
p=>p.GetCustomAttributes(typeof(MyAttribute), true).Length != 0)
https://stackoverflow.com/questions/2281972
复制相似问题