2012-03-16 7 views
1

Я создал пользовательский атрибут, который записывается на консоль, когда он попал, однако он, похоже, не попал. Это учебник по микрософт (http://msdn.microsoft.com/en-us/library/sw480ze8.aspx) и запускается в 2010 году .net 4. Я предполагаю, что это должно быть я, что делает что-то неправильно, но Я не понимаю, что это. Может ли кто-нибудь помочь?Пользовательский атрибут не попадает

Это атрибут, код которого никогда не быть пораженным

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] 
public class Author : Attribute 
{ 
    private string _name; 
    private double _version; 

    public Author(string name) 
    { 
     Console.WriteLine(string.Format("author {0} was just created", name)); 

     _name = name; 
     _version = 1.0; 
    } 
} 

Это класс, который использует его - это успешно выписывая код в конструкторе:

/// <summary> 
/// TODO: Update summary. 
/// </summary> 
[Author("P. Ackerman")] 
public class Ackerman 
{ 
    public Ackerman() 
    { 
     Console.WriteLine("I created Ackerman."); 
    } 
} 

И это консольное приложение, которое его вызывает, и успешно распечатывает код в новом конструкторе Ackerman():

static void Main(string[] args) 
    { 
     Ackerman author1 = new Ackerman(); 
     Console.ReadLine(); 
    } 

Спасибо!

+0

Атрибут против определения типа не против экземпляра типа, так что вы не увидите конструктор атрибута с именем если вы не попытаетесь его проверить – kaj

ответ

3

Экземпляры атрибутов на классе не создаются, тогда вы создаете экземпляр класса. Только тогда вы специально просит для них, как это:

var attrib = author1.GetType().GetCustomAttributes(false); 

Этот код будет инициировать Console.WriteLine(string.Format("author {0} was just created", name));

+0

Спасибо за это - вы совершенно правы. Но в чем смысл иметь атрибут, если вам нужно называть его отдельно? – rozza

+1

Атрибуты полезны во многих ситуациях, обычно для декларативного программирования. Вы можете прочитать о некоторых стандартных атрибутах, таких как Serializable, DataMember, ServiceContract и т. Д. Вы можете использовать свой атрибут Author, например, для отображения всех классов конкретного автора. Вы также должны прочитать о Aspect Oriented programming, потому что это почти так же, как вы пытались сделать с атрибутами – Nikolay

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