自定义属性的 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
(类型 可分配 吗?)。
是否有等同于 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
(类型 可分配 吗?)。