在 c # 中使用十进制值作为属性参数?

我一直在尝试使用十进制值作为字段属性的参数,但我得到了一个编译器错误。

我发现这篇博客文章 链接说这是不可能的。那么,有人知道他们为什么选择这个或者我如何使用十进制参数吗?

17364 次浏览

This is a CLR restriction. Only primitive constants or arrays of primitives can be used as attribute parameters. The reason why is that an attribute must be encoded entirely in metadata. This is different than a method body which is coded in IL. Using MetaData only severely restricts the scope of values that can be used. In the current version of the CLR, metadata values are limited to primitives, null, types and arrays of primitives (may have missed a minor one).

Decimals while a basic type are not a primitive type and hence cannot be represented in metadata which prevents it from being an attribute parameter.

For realtime tricks with attributes i am using TypeConverter class.

When I have run into this situation, I ended up exposing the properties on the attribute as a Double, but inside the attribute treated them like Decimal. Far from perfect, but for the simple cases, it just might be what you need.

You can use the following constructor. When you have a decimal literal in C# code, the C# compiler emits a call to this constructor.

Decimal(Int32, Int32, Int32, Boolean, Byte)

Edit: I know this is not convenient.

I have the same problem. I consider to use strings. This is not type-safe, but it's readable and I think we will be able to write valid numbers in strings :-).

class BlahAttribute : Attribute
{
private decimal value;


BlahAttribute(string number)
{
value = decimal.Parse(number, CultureInfo.InvariantCulture);
}
}


[Blah("10.23")]
class Foo {}

It's not a beauty, but after considering all the options, it's good enough.