考虑一个程序集包含一个或多个属于自定义属性MyAttribute
的类型的情况,您需要获取这些类型的列表。除了更紧凑的语法之外,使用IsDefined与GetCustomAttributes有什么好处?是否暴露/隐藏了另一个没有的东西?一个比另一个更有效吗?
以下是演示每种用法的代码示例:
Assembly assembly = ...
var typesWithMyAttributeFromIsDefined =
from type in assembly.GetTypes()
where type.IsDefined(typeof(MyAttribute), false)
select type;
var typesWithMyAttributeFromGetCustomAttributes =
from type in assembly.GetTypes()
let attributes = type.GetCustomAttributes(typeof(MyAttribute), false)
where attributes != null && attributes.Length > 0
select type;
答案 0 :(得分:9)
使用这两种方法进行快速测试,似乎IsDefined
比GetCustomAttributes
快得多
200000次迭代
IsDefined average Ticks = 54
GetCustomAttributes average Ticks = 114
希望这会有所帮助:)
答案 1 :(得分:2)
正如萨达姆所说,IsDefined
比GetCustomAttributes
更有效率。这是可以预料的。
作为documented here,将属性MyAttribute
应用于类MyClass
在概念上等同于创建MyAttribute
实例。但是,实例化实际上并不会发生,除非MyClass
与GetCustomAttributes
一样查询属性。
IsDefined
不会实例化MyAttribute
。