- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试找出从属性中获取自定义属性的最佳方法。我一直在使用 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 的实例.此类主要包含有关属性类型的信息,但也包含有关构造函数和构造函数参数甚至构造函数参数名称的信息。
这些属性必须使用反射来设置,因为创建属性实例只是一个标准的对象创建。当然这完全取决于你的属性的构造函数有多复杂,虽然一般来说我很少看到复杂的属性。
因此,与 GetCustomAttributes
相比,调用 GetCustomAttributesData
可为您提供更多/不同的属性信息,但(对于简单属性)这是一项成本更高的操作。
但是,如果您打算在同一 MemberInfo
对象上多次调用 GetCustomAttributesData
,它可能会更快,因为通常会缓存反射调用。但我没有对此进行基准测试,因此请对它持保留态度。
关于c# - GetCustomAttributes 与 GetCustomAttributesData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47184352/
我正在尝试找出从属性中获取自定义属性的最佳方法。我一直在使用 GetCustomAttributes()为此,但我最近读到 GetCustomAttributes() 会导致创建属性的实例,并且 Ge
您可以加载程序集并查询所有程序集属性,包括 AssemblyInformationalVersionAttribute , AssemblyVersionAttribute和 AssemblyFile
我是一名优秀的程序员,十分优秀!