1

我正在尝试检查类型是否定义了 [DataContract] 属性或继承了定义了它的类型

例如:

[DataContract]
public class Base
{
}


public class Child : Base
{
}

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

Attribute.IsDefined 和 Attribute.GetCustomAttribute 不查看基类

任何人都知道如何在不查看 BaseClasses 的情况下做到这一点

4

2 回答 2

5

GetCustomAttribute()和方法有一个重载,GetCustomAttributes(bool inherit)它采用布尔值是否在继承的类中进行搜索。但是,只有当您要搜索的属性是用该属性定义的时,它才会起作用[AttributeUsage(AttributeTargets.?, Inherited = true)]

于 2012-11-19T15:04:03.943 回答
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))
于 2012-11-19T15:20:52.733 回答