在c#中使用十进制值作为属性参数?
我一直在尝试使用十进制值作为参数的字段属性,但我得到一个编译器错误。
我发现这个博客文章链接说,这是不可能在.Net使用,然后有人知道他们为什么select这个或如何使用十进制参数?
谢谢。
这是一个CLR限制。 只有基本常量或基元数组可以用作属性参数。 原因是一个属性必须完全在元数据中进行编码。 这与在IL中编码的方法主体不同。 使用MetaData只能严格地限制可以使用的值的范围。 在CLR的当前版本中,元数据值仅限于基元,null,types和基元数组(可能错过了次要元素)。
而基本types的小数不是原始types,因此不能在元数据中表示,从而防止它成为属性参数。
我也有同样的问题。 我考虑使用string 。 这不是types安全的,但它是可读的,我想我们将能够在string中写入有效的数字:-)。
class BlahAttribute : Attribute { private decimal value; BlahAttribute(string number) { value = decimal.Parse(number, CultureInfo.InvariantCulture); } } [Blah("10.23")] class Foo {}
这不是一个美丽的,但考虑到所有的select后,这是够好的。
当我遇到这种情况时,我最终暴露了属性的属性作为一个Double,但在属性内处理他们像十进制。 远非完美,但对于简单的情况,它可能就是你所需要的。
对于具有属性的实时技巧,我正在使用TypeConverter类。
你可以使用下面的构造函数。 当C#代码中有十进制文字时,C#编译器会发出对此构造函数的调用。
Decimal(Int32, Int32, Int32, Boolean, Byte)
编辑:我知道这是不方便的。