自定义属性的 typeof(class) 等价物

Equivalent of typeof(class) for custom attribute

是否有等同于 typeof( ) 的自定义属性?

具体来说,我想以不依赖字符串比较的方式重写这段代码

if (prop.GetCustomAttributes(true).Any(c => c.GetType().Name == "JsonIgnoreAttribute")) { ... }

使用 typeof() 有什么问题?或者更好,is?

if (prop.GetCustomAttributes(true).Any(c => c is JsonIgnoreAttribute))

您还可以这样做:

if (prop.GetCustomAttributes(true).OfType<JsonIgnoreAttribute>().Any())

if (prop.GetCustomAttributes(typeof(JsonIgnoreAttribute), true).Any())

有一个overload of GetCustomAttributes,它接受你想要的类型作为参数:

prop.GetCustomAttributes(typeof(JsonIgnoreAttribute), true)

但是 因为您实际上是在检查属性是否存在,所以您应该使用 the IsDefined function:

if (Attribute.IsDefined(prop, typeof(JsonIgnoreAttribute), true))

这不会实例化属性,因此性能更高。

如果你不需要inherit参数,你可以这样写:

if (prop.IsDefined(typeof(JsonIgnoreAttribute)))

出于某种原因,此参数在属性和事件的 MemberInfo.IsDefined 函数中 被忽略 ,但在 Attribute.IsDefined 中被考虑在内。去图吧。

请注意,任何 可分配 JsonIgnoreAttribute 的类型都将被这些函数匹配,因此派生类型也将被返回。


附带说明一下,您可以像这样直接比较 Type 个对象:
c.GetType() == typeof(JsonIgnoreAttribute)(与完全相同类型吗?),
c is JsonIgnoreAttribute(类型 可分配 吗?)。