我一直在尝试使用十进制值作为字段属性的参数,但出现编译器错误。
我发现此博客文章链接指出,当时无法在.NET中使用,有人知道为什么选择它,或者如何使用十进制参数?
Answers:
这是CLR限制。仅原始常量或原始数组可以用作属性参数。原因是属性必须完全在元数据中编码。这与用IL编码的方法主体不同。仅使用MetaData会严格限制可以使用的值的范围。在CLR的当前版本中,元数据值限于原语,空值,原语的类型和数组(可能遗漏了较小的一个)。
基本类型不是原始类型的小数,因此不能在元数据中表示,这阻止了它成为属性参数。
Using MetaData only severely restricts the scope of values that can be used
-为什么呢?元数据可用于指向类型定义。例如,当您在常规类中定义字段时,将发出元数据,其中包括字段名称及其类型(任何类型,而不是突出原语)。我不明白为什么不能将此用于属性。
我也有同样的问题。我考虑使用字符串。这不是类型安全的,但是它是可读的,我认为我们将能够在字符串中写入有效数字:-)。
class BlahAttribute : Attribute
{
private decimal value;
BlahAttribute(string number)
{
value = decimal.Parse(number, CultureInfo.InvariantCulture);
}
}
[Blah("10.23")]
class Foo {}
这不是美,但考虑所有选择之后,就足够了。
对于具有属性的实时技巧,我正在使用TypeConverter类。
您可以使用以下构造函数。当您在C#代码中使用十进制文字时,C#编译器将对此构造函数进行调用。
Decimal(Int32, Int32, Int32, Boolean, Byte)
编辑:我知道这不方便。