2009-09-01 3 views
0

Предположим, у меня есть класс с именем Данные. Другой класс аннотирует один из его членов, тип данные, с некоторым атрибутом. Например:Получение пользовательских атрибутов, которые были установлены за пределами класса

public class Example{ 

    [DefaultNameAttribute("default name")] 
    public Data Name{get;set} 
} 

Что я ищу способ, из класса данных, чтобы получить этот атрибут и содержащиеся в нем данные. Я хочу, чтобы иметь возможность написать следующий код:

public class Data{ 
    private string _name = null; 
    public string Name{ 
     get{ 
      if (_name != null) return _name; 
      return (getDefaultNameFromAnnotation(this));//this is the method I'm looking for 
     } 
} 

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

ответ

0

Короткий ответ: вы не можете или, по крайней мере, не должны.

DefaultNameAttribute наносится на элемент Example, который декорирован от Data. Могут быть несколько типов, которые используют тип Data, а также несколько экземпляров DefaultNameAttribute. Example может быть определен в другом сборке и т. Д.

0

Это будет зависеть от того, как используется ваш атрибут (если он относится к классу, свойству, методу и т. Д.). Например, если она используется только на классе вы могли бы получить все типы, которые отмечены с атрибутом со следующим кодом:

public IEnumerable<Type> GetTypes(Assembly assembly) 
{ 
    foreach(Type type in assembly.GetTypes()) 
    { 
     if (type.GetCustomAttributes(typeof(DefaultNameAttribute), true).Length > 0) 
     { 
      yield return type; 
     } 
    } 
} 

Если используется только на свойства (в качестве примера), то вы можете вложить дополнительный оператор foreach, который будет перечислять все свойства для данного типа и искать атрибут.

Смежные вопросы