Это действительно невероятно, но реально. Этот код не будет работать:
[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field)]
public class Range : Attribute
{
public decimal Max { get; set; }
public decimal Min { get; set; }
}
public class Item
{
[Range(Min=0m,Max=1000m)] //compile error:'Min' is not a valid named attribute argument because it is not a valid attribute parameter type
public decimal Total { get; set; }
}
Пока это работает:
[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field)]
public class Range : Attribute
{
public double Max { get; set; }
public double Min { get; set; }
}
public class Item
{
[Range(Min=0d,Max=1000d)]
public decimal Total { get; set; }
}
Кто может сказать мне, почему double - это нормально, а decimal - нет.
c#
.net
attributes
Ченг Чен
источник
источник
Ответы:
Взято из этого ответа от JaredPar .
источник
Enum
поддерживаются. В настоящее время у меня есть 2 пользовательских атрибута, один с двумя перечислениями, а другие с массивом перечислений.Из спецификации :
источник
sbyte
,ushort
,uint
,ulong
. И это, кажется, работает хорошо. Но всеdecimal
равно не допускается :-(Ответом на эту проблему является использование строк, которые разрешены в качестве атрибутов, несмотря на то, что они не являются атомарными. Не используйте двойные числа, поскольку округление сделает результаты менее точными.
источник