2011-05-13 3 views
2

Можно ли в C# в конструкторе атрибута, чтобы получить класс, который имеет атрибут, возложенные на него без этого имени класса в.получить атрибуты класса

[MyAttr] 
    public class A{} 

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
    [Serializable] 
    public class MyAttrAttribute: Attribute 
    { 
     public MyAttrAttribute() 
     { 
      //get info here about the class A etc 
     }  
    } 

ответ

2

No. Но почему вы хотите сделать это? Чего вы пытаетесь достичь?

Когда вы извлекаете атрибут во время выполнения, вы делаете это из объекта типа, представляющего класс. Поэтому, хотя информация не сохраняется в объекте атрибута, она легко доступна.

+0

«вы делаете это от объекта типа, представляющего класс», - чтобы быть более четким, вы извлекаете атрибуты из 'Type', который представляет * все * экземпляры класс ... поэтому вы не * обязательно * имеете доступный экземпляр –

+1

Мне нужно поместить атрибут для каждого из моих классов для целей аудита, а атрибут обозначает класс аудита-приятеля, почти во всех случаях класс buddy называется таким же, как оригинал с «Аудитом», прикрепленным к концу, d хотел бы иметь конструктор по умолчанию, который, когда вы не даете anythign, использует это соглашение по умолчанию –

+0

@Mark, объект Type не представляет всех экземпляров класса, он представляет сам класс. @Danielhttp, я бы сделал вспомогательный метод, чтобы получить класс приятеля; этот метод будет извлекать атрибут, и если атрибут его в состоянии по умолчанию (или, возможно, если он отсутствует вообще), это подразумевает соглашение по умолчанию. – phoog

0

Это была бы удобная функция, хороший вопрос. Но фундаментальные атрибуты означают только метаданные, чтобы инспекторы не были инспекторами - они являются постоянными данными.

3

Экземпляры атрибутов полностью независимы от типов/полей/свойств, которые они украшают; нет абсолютно никакого способа получить доступ к контексту из атрибута. Однако атрибуты также не создаются, пока вы явно не запросите их с отражением.

Если вы хотите, чтобы вызвать определенную логику, то это должно быть сделано явно через код - так что вы могли бы рассмотреть добавление метода на атрибуте , который принимает объект контекста:

public void Invoke(object instance) {...} 

, например, то используйте GetCustomAttribute для его получения, произведите его и вызовите .Invoke()

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