8

考虑这样一种情况,即程序集包含一个或多个具有自定义属性的类型,MyAttribute并且您需要获取这些类型的列表。除了更紧凑的语法之外,使用IsDefinedGetCustomAttributes有什么好处吗?一个人是否暴露/隐藏了另一个人没有的东西?一个比另一个更有效吗?

这是一个演示每种用法的代码示例:

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;
4

2 回答 2

12

用这两种方法做了一个快速测试,它似乎IsDefinedGetCustomAttributes

200000 次迭代

IsDefined average Ticks = 54
GetCustomAttributes average Ticks = 114

希望这可以帮助 :)

于 2013-02-06T00:51:55.787 回答
3

正如萨达姆所展示的,IsDefined比 更有效GetCustomAttributes。这是可以预料的。

如此所述,将属性MyAttribute应用于类MyClass在概念上等同于创建MyAttribute实例。MyClass但是,除非像 with 那样查询属性,否则实例化实际上不会发生GetCustomAttributes

IsDefined,另一方面,不实例化MyAttribute

于 2016-08-31T22:14:31.413 回答