Почему "decimal" не является допустимым типом параметра атрибута?
Это действительно невероятно, но реально. Этот код не будет работать:
[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-нет.
3 ответов:
это ограничение среды CLR. Только примитивные константы или массивы примитивы могут использоваться в качестве атрибута параметры. Причина, почему это так атрибут должен быть полностью закодирован в метаданные. Это отличается от тело метода, которое кодируется в IL. Использование метаданных только сильно ограничивает область значений, которые можно использовать. В текущей версии среды CLR, значения метаданных ограничены примитивы, null, типы и массивы примитивы (может иметь пропустил несовершеннолетнего один.)
принято от этой ответ JaredPar.
десятичные знаки, в то время как базовый тип не является примитивный тип, и, следовательно, не может быть представлен в метаданных, которые предотвращают это от того, чтобы быть параметром атрибута.
типы позиционных и именованных параметров для класса атрибута ограничены типами параметров атрибута, которые являются:
- один из следующих типов:
bool,byte,char,double,float,int,long,sbyte,short,string,uint,ulong,ushort.- тип
object.- тип
System.Type.- тип перечисления, при условии, что он имеет общедоступный доступ и типы, в которые он вложен (если таковые имеются), также имеют общедоступный доступ (спецификация атрибутов).
- одномерные массивы вышеуказанных типов.
ответ на эту проблему заключается в использовании строк, которые разрешены в качестве атрибутов, несмотря на то, что не являются атомарным типом. Не используйте двойники, так как округление сделает результаты менее точными.
public String MinimumValue { get { return minimumValueDecimal.ToString(); } set { minimumValueDecimal = Decimal.Parse(value); } } private decimal minimumValueDecimal;
Comments