自定义属性的等效类型(类)

时间:2016-07-13 16:54:02

标签: c# attributes custom-attributes

自定义属性是否等效typeof( )

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

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

2 个答案:

答案 0 :(得分:3)

有一个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(类型可分配?)。

答案 1 :(得分:2)

使用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())