属性和类

本文关键字:属性 | 更新日期: 2023-09-27 18:10:29

我在搜索,我怎么能知道内部属性定义,如果类我应用的属性,有另一个属性
例子:

[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 ???
     }
}

属性和类

属性本身不知道它所附加的类。你需要使用其他一些服务/辅助函数/任何东西来配对它们。

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

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

Edit:查找成员字段的属性

/// <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;
}

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

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.

您尝试过反射吗?,另外这里有一个相关的问题,你可能会发现有帮助:如何检查c#类是否有安全属性使用

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

我不认为你可以做任何聪明的事情,如自动检索类列表与当前属性。