GetCustomAttributesData

GetCustomAttributesData

我试图找出从属性中获取自定义属性的最佳方法。我一直为此使用 GetCustomAttributes() ,但是最近我读到GetCustomAttributes()会导致创建该属性的实例,而 GetCustomAttributesData() 只是获取有关该属性的数据而不必创建该属性的实例。

考虑到这一点,似乎GetCustomAttributesData()应该更快,因为它没有创建该属性的实例。但是,我在测试中没有看到预期的结果。在类中遍历属性时,第一次迭代的GetCustomAttributes()运行大约6毫秒,而GetCustomAttributesData()运行大约32毫秒。

有谁知道为什么GetCustomAttributesData()需要更长的时间才能运行?

我的主要目标是测试属性的存在,并忽略任何包含该属性的属性。我并不特别在意最终使用哪种方法,除了了解GetCustomAttributesData()为什么比GetCustomAttributes()慢的原因之外,我并不真正关心哪种方法返回的结果。

这是我用来测试的一些示例代码。我通过注释掉一个然后再注释掉另一个独立地测试了这些if语句。

public static void ListProperties(object obj)
{
    PropertyInfo[] propertyInfoCollection = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

    foreach (PropertyInfo prop in propertyInfoCollection)
    {
        // This runs around 6ms on the first run
        if (prop.GetCustomAttributes<MyCustomAttribute>().Count() > 0)
            continue;

        // This runs around 32ms on the first run
        if (prop.GetCustomAttributesData().Where(x => x.AttributeType == typeof(MyCustomAttribute)).Count() > 0)
            continue;

        // Do some work...
    }
}

public class MyCustomAttribute : System.Attribute
{
}

不久前,在阅读 IsDefined() 帖子后,我决定尝试this方法。它似乎比GetCustomAttributes()GetCustomAttributesData()都快。
if (prop.IsDefined(typeof(MyCustomAttribute)))
    continue;

最佳答案

GetCustomAttributesData还可以创建新对象的实例,而不仅仅是属性本身。它创建CustomAttributeData的实例。此类主要包含有关属性类型的信息,但也包含有关构造函数和构造函数参数,甚至是构造函数参数名称的信息。

这些属性必须使用反射镜来设置,创建属性实例只是标准的对象创建。当然,这全都取决于属性构造函数的复杂程度,尽管总的来说,我很少见到复杂的属性。

因此,与GetCustomAttributesData相比,调用GetCustomAttributes可以为您提供关于属性的更多/不同的信息,但是(对于简单属性)这是一项成本更高的操作。

但是,如果您打算在同一个GetCustomAttributesData对象上多次调用MemberInfo,则可能会更快,因为通常会缓存反射调用。但是我没有对此进行基准测试,所以要加点盐。

10-04 23:03