Получение пользовательских атрибутов, которые были установлены вне класса - PullRequest
0 голосов
/ 01 сентября 2009

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

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

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

Ответы [ 2 ]

0 голосов
/ 01 сентября 2009

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

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

0 голосов
/ 01 сентября 2009

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

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

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

...