Атрибуты и классы - PullRequest
       1

Атрибуты и классы

2 голосов
/ 04 октября 2011

Я ищу, как узнать в определении атрибута, имеет ли другой класс атрибут, к которому я применяю атрибут,
Пример:

[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 ]

2 голосов
/ 04 октября 2011

Сам атрибут не будет знать о классе, к которому он прикреплен.Вам нужно будет использовать некоторые другие сервисные / вспомогательные функции / что угодно для их сопряжения.

Однако может оказаться полезным следующее:

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 голос
/ 04 октября 2011

В этом случае вам необходимо определить свои правила о том, как вы определяете, каких участников вы собираетесь проверять. В вашем примере вы используете атрибутированную декорацию для свойства, поэтому, если у вас есть экземпляр Type для MyClass (например, 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.
0 голосов
/ 04 октября 2011

Полагаю, вы имеете в виду, в общем, выяснить, есть ли у какого-либо класса с MyAttribute1 My2Attribute (а не конкретно MyClass).Единственный способ, которым я могу думать, это получить список всех классов из рефлексии и выполнить итерацию по ним, проверяя, какие из них имеют Attribute1, а затем проверять, есть ли у них Attribute2.

Не думаю, что вы можете сделать что-нибудь умное, например, автоматически получить список классов с текущим атрибутом.

0 голосов
/ 04 октября 2011

Вы пробовали Отражение ?, а также вот связанный вопрос, который может оказаться полезным: Как проверить, используется ли в классе C # атрибут безопасности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...