Что лучший способ состоит в том, чтобы реализовать пользовательские атрибуты в dotnet/.NET?

Это работает для меня. Ruby 2.0.0 Rails 3.2.13 Puma 1.6.3

rails s puma
9
задан IAmAN00B 10 June 2009 в 14:06
поделиться

7 ответов

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

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

Код:

public class TextLengthAttribute : Attribute
{
    private int length;
    public int Length { get { return 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");
               }
          }
     }
}

Примечание: непроверено

9
ответ дан 4 December 2019 в 07:35
поделиться

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

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

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

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

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

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

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

2
ответ дан 4 December 2019 в 07:35
поделиться

У нас есть требование отображать значения 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
}
3
ответ дан 4 December 2019 в 07:35
поделиться

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

Определение и использование пользовательских классов атрибутов в C #

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

11
ответ дан 4 December 2019 в 07:35
поделиться

Есть много, например, 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; }

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

2
ответ дан 4 December 2019 в 07:35
поделиться

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

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

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

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

}

Затем мы могли бы создать модульный тест, который находит все классы с атрибутом и гарантирует, что они действительно неизменяемы :

[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);
  }
}
1
ответ дан 4 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: