Это работает для меня. Ruby 2.0.0 Rails 3.2.13 Puma 1.6.3
rails s puma
Допустим, у вас есть класс с рядом свойств, которые вы собираетесь пройти, используя отражение. Любые строки могут нуждаться в проверке, чтобы убедиться, что они не длиннее определенного количества.
Затем вы можете создать атрибут 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");
}
}
}
}
Примечание: непроверено
Атрибут используется для предоставления метаданных о любом члене (полях, классе и т. Д.).
Вы можете создать их, унаследовав от Атрибут , и использовать их используя Attribute.GetCustomAttribute
Примером атрибута по умолчанию является атрибут PrincipalPermissionAttribute , который позволяет только аутентифицированным пользователям получать доступ к определенным ресурсам. Например:
[PrincipalPermission (SecurityAction.Demand, Role="Supervisor")]
public class DoTheThingPage : Page
{
////
}
В этом примере у нас есть страница ASP.NET, которую может просматривать только аутентифицированный пользователь, который принадлежит к роли «Супервизор».
(Этот атрибут автоматически считывается подсистемой безопасности в ASP.NET)
Также обратите внимание, что часть «Атрибут» имени класса не использовалась, это соглашение внутри .NET.
У нас есть требование отображать значения 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
}
Я мог бы привести вам пример, но он бледнел бы по сравнению с этой прекрасной статьей:
Определение и использование пользовательских классов атрибутов в C #
Сложный компонентный стиль развитие, которого ожидают от бизнеса современных разработчиков программного обеспечения требует большая гибкость дизайна, чем у прошлые методики проектирования. Microsoft .NET Framework делает широкое использование атрибутов для предоставления добавленная функциональность через то, что есть известное как «декларативное» программирование. Атрибуты повышают гибкость в программные системы, потому что они продвигают слабая связь функциональности. Потому что вы можете создать свой собственный классы атрибутов, а затем действовать их, вы можете использовать свободные объединяющая сила атрибутов для вашего для собственных целей.
Есть много, например, 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; }
Вы можете позже извлеките атрибут, чтобы отобразить его в графическом интерфейсе.
И для полноты картины MSDN:
http://msdn.microsoft.com/en-us/library/aa288454.aspx
http://msdn.microsoft .com / en-us / library / sw480ze8.aspx
Атрибут - это просто способ добавить дополнительную информацию (метаданные) к классу, структуре или некоторому члену. Эти метаданные могут быть получены другим кодом для принятия некоторых решений.
Простейший пример - 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);
}
}