0

我正在尝试创建扩展方法来检查特定对象是否具有特定属性。

我找到了使用以下语法检查它的示例:

private static bool IsMemberTested(MemberInfo member)
{
foreach (object attribute in member.GetCustomAttributes(true))
    {
        if (attribute is IsTestedAttribute)
        {
           return true;
        }
    }
return false;
}

现在我正在尝试执行以下操作:

    public static bool HasAttribute<T>(this T instance, Type attribute)
    {
        return typeof(T).GetCustomAttributes(true).Any(x => x is attribute);
    }

但是我收到消息“缺少类型或命名空间‘属性’......”

我做错了什么并且与给定的示例不同/我怎样才能做到这一点?

编辑:

感谢您的提示,我现在已经设法做到了:

    public static bool HasAttribute<T>(this T instance, Type attribute)
    {
        return typeof(T).GetCustomAttributes(attribute, true).Any();
    }

检查属性是这样的:

var cc = new CustomClass();
var nullable = cc.HasAttribute(typeof(NullableAttribute));

谢谢你们的帮助。现在我有另一个问题。假设我想用属性装饰类的属性,字符串类型的属性,并想稍后检查该属性是否具有属性。由于这仅适用于类型,因此我无法将其应用于属性级别。房产检查有什么解决办法吗?

4

2 回答 2

3

您不能将Type变量用作is运算符的参数。此外,没有必要Any自己过滤这个,因为GetCustomAttributes它会为你做一个超载。

我已经为类似的功能编写了这个扩展方法(我的是将应用到类的单个属性返回):

    internal static AttributeType GetSingleAttribute<AttributeType>(this Type type) where AttributeType : Attribute
    {
        var a = type.GetCustomAttributes(typeof(AttributeType), true);
        return (AttributeType)a.SingleOrDefault();
    }

您可以修改它以返回一个布尔值a != null,而不是获取您要查找的内容。

于 2012-10-25T12:20:58.537 回答
0

我已经就如何检查简单类型的属性属性提出了解决方案:

    public static bool HasPropertyAttribute<T>(this T instance, string propertyName, Type attribute)
    {
        return Attribute.GetCustomAttributes(typeof(T).GetProperty(propertyName), attribute, true).Any();
    }

调用是这样的:

var cc = new CustomClass();
cc.HasPropertyAttribute("Name", typeof(NullableAttribute));
于 2012-10-25T13:41:46.943 回答