属性和类

时间:2011-10-04 18:22:27

标签: c# attributes

我正在搜索如何在属性定义中知道我应用属性的类,还有另一个属性
示例:

[My1Attribute]  
public class MyClass  
{   
    [My2Attribute]  
    int aux{get;set;}  

}        

internal sealed class My1Attribute : Attribute
{ 
     public My1Attribute
     {
           // How can  I Know if 'MyClass' has My2Attribute applied ???
     }
}

4 个答案:

答案 0 :(得分:2)

属性本身不会知道它所附加的类。您将需要使用其他一些服务/帮助函数/无论如何配对它们。

但是,您可能会发现以下内容:

public static bool HasAttribute<T, TAttribute>() where TAttribute : Attribute
{
    return typeof (T).GetCustomAttributes(typeof (TAttribute), true).Any();
}

修改用于查找成员字段的属性

/// <summary>
/// Returns all the (accessible) fields or properties that for a given type that
/// have the "T" attribute declared on them.
/// </summary>
/// <param name="type">Type object to search</param>
/// <returns>List of matching members</returns>
public static List<MemberInfo> FindMembers<T>(Type type) where T : Attribute
{
    return FindMembers<T>(type, MemberTypes.Field | MemberTypes.Property);
}

/// <summary>
/// Returns all the (accessible) fields or properties that for a given type that
/// have the "T" attribute declared on them.
/// </summary>
/// <param name="type">Type object to search</param>
/// <returns>List of matching members</returns>
public static List<MemberInfo> FindMembers<T>(Type type, MemberTypes memberTypesFlags) where T : Attribute
{
    const BindingFlags FieldBindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;

    List<MemberInfo> members = new List<MemberInfo>();
    members.AddRange(type.FindMembers(
                            memberTypesFlags,
                            FieldBindingFlags,
                            HasAttribute<T>, // Use delegate from below...
                            null)); // This arg is ignored by the delegate anyway...

    return members;
}

public static bool HasAttribute<T>(MemberInfo mi) where T : Attribute
{
    return GetAttribute<T>(mi) != null;
}

public static bool HasAttribute<T>(MemberInfo mi, object o) where T : Attribute
{
    return GetAttribute<T>(mi) != null;
}

答案 1 :(得分:1)

在这种情况下,您需要定义有关如何确定要检查的成员的规则。在您的示例中,您正在使用属性上的属性装饰,因此假设Type的实例MyClass(例如typeof(MyClass)),您可以获取属性:< / p>

var property = type.GetProperty("aux", BindingFlags.Instance | BindingFlags.NonPublic);
if (property.IsDefined(typeof(My1Attribute))) 
{
    // Property has the attribute.
}

(假设您实际上想要获取非公开实例属性,如果不调整您的BindingFlags)。

如果您确实想使用该属性:

var attib = property.GetCustomAttributes(typeof(My1Attribute), false)[0];
// Do something with the attribute instance.

答案 2 :(得分:0)

您是否尝试过Reflection ?,此外还有一个您可能会发现有用的相关问题:How to check if C# class has security attribute used

答案 3 :(得分:0)

我猜你的意思通常是找出MyAttribute1的任何一个类是否有My2Attribute(而不是具体的MyClass)。我能想到的唯一方法是从反射中获取所有类的列表,并通过它们迭代检查哪些类具有Attribute1,然后检查它们是否具有Attribute2。

我认为你不能做任何聪明的事情,比如自动检索具有当前属性的类列表。