自定义属性是否等效typeof( )
?
具体来说,我想以这样一种方式重写这段代码,我不会依赖字符串比较
if (prop.GetCustomAttributes(true).Any(c => c.GetType().Name == "JsonIgnoreAttribute")) { ... }
答案 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())