2009-06-10 3 views
9

Я не совсем понимаю атрибуты. Я читал всевозможные книги & сообщений на них, но я просто не понимаю.Каков наилучший способ реализации пользовательских атрибутов в dotnet/.NET?

Поскольку я их не понимаю, я также не понимаю, как эффективно их использовать.

1) Можете ли вы дать мне хорошее определение того, что такое атрибут &, для чего он используется?

2) Можете ли вы дать мне хороший пример кода на C#, как сделать и использовать пользовательский атрибут?

ответ

9

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

Затем вы можете создать атрибут textLength с конструктором целочисленного значения по умолчанию и целочисленным свойством/полем. Затем вы можете прочитать свой атрибут для каждого свойства строки в своем классе и сравнить длину значения свойства с номером, указанным в атрибуте.

Код:

public class TextLengthAttribute : Attribute 
{ 
    private int length; 
    public int Length { get { retrun length; } set { length = value; } } 

    public TextLengthAttribute(int num) { this.length = num ; } 
} 

public class MyClass 
{ 

    [TextLength(10)] 
    public string Property1; 
    [TextLength(20)] 
    public string Property2; 
} 

public class ClassReader 
{ 
    public static void Main() 
    { 
      MyClass example = MyClass.GetTestData(); 

      PropertyInfo[] props = typeof(MyClass).GetProperties(); 
      foreach (PropertyInfo prop in props) 
      { 
       if (prop.ValueType == typeof(String) 
       { 
        TextLengthAttribute[] atts = 
         (TextLengthAttribute)[]prop.GetCustomAttributes(
          typeof(TextLengthAttribute), false); 
        if (prop.GetValue(example, null).ToString().Length > 
         atts[0].Length) 
         throw new Exception(prop.name + " was too long"); 
       } 
      } 
    } 
} 

Примечание: тестировалась

2

Имейте много напр. log4PostSharp. Они используют атрибуты для введения поведения АОП.

Вот атрибут я один раз, чтобы дать Свойства единицы (например, секунды, метр, ...)

[AttributeUsage(AttributeTargets.Property)] 
public sealed class UnitAttribute : Attribute 
{ 
    public UnitAttribute(Unit unit) 
    { 
    Unit = unit; 
    } 

    public Unit Unit { get; private set; } 
} 

Он был использован на свойства, например:

[Unit(Unit.Meter)] 
public float Distance { get; set; } 

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

11

Я мог бы дать вам пример, но он будет бледно в сравнении с этой прекрасной статьей:

Defining and Using Custom Attribute Classes in C#

комплекс, составляющая стиль развития, бизнес ожидать от современных разработчиков программного обеспечения требуется большая гибкость дизайна, чем методологии проектирования прошлого. Microsoft .NET Framework делает широкое использование атрибутов для предоставления добавленной функциональности через то, что является , известным как «декларативное» программирование. Атрибуты повышают гибкость в программных системах , потому что они способствуют уменьшению функциональности связи . Поскольку вы можете создать свои собственные классы атрибутов , а затем действовать по им, вы можете использовать свободную связь с атрибутами для ваших собственных целей.

2

атрибут используется для предоставления метаданных о каком-либо элементе (поля, класс и т.д.).

Вы можете создать их с помощью наследования Attribute, и истреблю их с помощью метода Attribute.GetCustomAttribute .

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

[PrincipalPermission (SecurityAction.Demand, Role="Supervisor")] 
public class DoTheThingPage : Page 
{ 
    //// 
} 

В этом примере у нас есть страницы ASP.NET, которые могут быть просмотрены только авторизованным пользователем, который принадлежит роль «супервайзера».

(Этот атрибут автоматически считываться безопасности подсистемы в ASP.NET)

Также отметим, что «Атрибут» часть имени класса не используется, это соглашение, в рамках .NET.

3

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

[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field, AllowMultiple = false)] 
public class EnumSortAttribute : Attribute 
{ 
    public int SortOrder; 
    public bool SortByDescription; 
} 

[EnumSort(SortByDescription=true)] 
public enum EnumSortByDescription 
{ 
    [Description("enO")] 
    One = 1, 
    [Description("2")] 
    Two = 2, 
    Three = 3, 
    [Description("rouF")] 
    Four = 4 
} 

public enum EnumCustomSortOrder 
{ 
    [EnumSort(SortOrder = 3)] 
    One = 1, 
    [EnumSort(SortOrder = 1)] 
    Two = 2, 
    [EnumSort(SortOrder = 2)] 
    Three = 3 
} 
1

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

Простейший пример - SerializableAttribute от .NET. Это указывает на то, что впоследствии класс может быть сериализован BinaryFormatter.

Вот другой пример - мы могли бы отметить некоторые классы в нашем коде с ImmutableAttribute, чтобы указать, что они не имеют никаких изменяемых полей и OK для многопоточных операций:

[Immutable] 
public sealed class ProcessingMessage 
{ 
    //... some code that should be thread-safe 

} 

Тогда мы может создать единичный тест, который найдет все классы с атрибутом и гарантирует, что they are immutable indeed:

[Test] 
public void Immutable_Types_Should_Be_Immutable() 
{ 
    var decorated = GlobalSetup.Types 
    .Where(t => t.Has<ImmutableAttribute>()); 

    foreach (var type in decorated) 
    { 
    var count = type.GetAllFields().Count(f => !f.IsInitOnly && !f.IsStatic); 
    Assert.AreEqual(0, count, "Type {0} should be immutable", type); 
    } 
} 
Смежные вопросы