我一直在尝试使用十进制值作为字段属性的参数,但出现编译器错误。
我发现这个博客文章链接说当时无法在.NET中使用,有人知道他们为什么选择这个或者我如何使用十进制参数吗?
我一直在尝试使用十进制值作为字段属性的参数,但出现编译器错误。
我发现这个博客文章链接说当时无法在.NET中使用,有人知道他们为什么选择这个或者我如何使用十进制参数吗?
这是 CLR 限制。只有原始常量或原始数组可以用作属性参数。原因是属性必须完全编码在元数据中。这与在 IL 中编码的方法体不同。使用 MetaData 只会严重限制可以使用的值的范围。在当前版本的 CLR 中,元数据值仅限于基元、null、类型和基元数组(可能遗漏了一个次要的)。
小数,而基本类型不是原始类型,因此不能在元数据中表示,这会阻止它成为属性参数。
我也有同样的问题。我考虑使用字符串。这不是类型安全的,但它是可读的,我认为我们将能够在字符串中写入有效数字:-)。
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)
编辑:我知道这不方便。