检查类型是否具有或继承具有特定属性的类型

时间:2012-11-19 15:00:23

标签: c# .net reflection

我正在尝试检查某个类型是否已定义[DataContract]属性,或者是否继承了已定义的类型

例如:

[DataContract]
public class Base
{
}


public class Child : Base
{
}

// IsDefined(typeof(Child), typeof(DataContract)) should be true;

Attribute.IsDefined,而Attribute.GetCustomAttribute不查看基类

任何人都知道如何在不查看BaseClasses的情况下执行此操作

2 个答案:

答案 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))