我正在尝试检查某个类型是否已定义[DataContract]属性,或者是否继承了已定义的类型
例如:
[DataContract]
public class Base
{
}
public class Child : Base
{
}
// IsDefined(typeof(Child), typeof(DataContract)) should be true;
Attribute.IsDefined,而Attribute.GetCustomAttribute不查看基类
任何人都知道如何在不查看BaseClasses的情况下执行此操作
答案 0 :(得分:4)
GetCustomAttribute()
和GetCustomAttributes(bool inherit)
方法有一个重载,它取一个bool值是否在继承的类中进行搜索。但是,只有在您使用[AttributeUsage(AttributeTargets.?, Inherited = true)]
属性定义要搜索的属性时,它才会起作用。
答案 1 :(得分:1)
试试这个
public static bool IsDefined(Type t, Type attrType)
{
do {
if (t.GetCustomAttributes(attrType, true).Length > 0) {
return true;
}
t = t.BaseType;
} while (t != null);
return false;
}
由于评论中的术语“递归”,我有了使用递归调用的想法。这是一个扩展方法
public static bool IsDefined(this Type t, Type attrType)
{
if (t == null) {
return false;
}
return
t.GetCustomAttributes(attrType, true).Length > 0 ||
t.BaseType.IsDefined(attrType);
}
像这样称呼它
typeof(Child).IsDefined(typeof(DataContractAttribute))