C#GetCustomAttributes vs GetCustomAttributesData

时间:2017-11-08 16:04:58

标签: c# .net

我正在尝试找出从属性获取自定义属性的最佳方法。我一直在使用GetCustomAttributes(),但我最近读到GetCustomAttributes()导致创建属性的实例,GetCustomAttributesData()只获取有关属性的数据,而不必创建属性的实例。 / p>

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

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

这是我用来测试的一些示例代码。我通过注释掉一个然后另一个来独立地测试每个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...
    }
}

修改

我的主要目标是测试属性是否存在,并忽略包含此属性的任何属性。我并不特别关心我最终使用哪种方法,并且我并不关心任何一种方法除了理解为什么GetCustomAttributesData()比GetCustomAttributes()慢之外的其他方法。

属性类并不多。它被定义为

namespace TestProject
{
    public class MyCustomAttribute : System.Attribute
    {
        public MyCustomAttribute() { }
    }    
}

就在不久之前,我决定在阅读this帖后尝试使用IsDefined方法。它似乎比GetCustomAttributes()和GetCustomAttributesData()都要快。

if (prop.IsDefined(typeof(MyCustomAttribute)))
    continue;

1 个答案:

答案 0 :(得分:0)

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

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

因此,调用GetCustomAttributesData会为您提供有关属性的更多/不同信息,而不是GetCustomAttributes,但是(对于简单属性)操作更为昂贵。

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