フィールド属性のパラメーターとして 10 進数値を使用しようとしましたが、コンパイル エラーが発生します。
.NET では使用できないと書かれているこのブログ投稿リンクを見つけました。
フィールド属性のパラメーターとして 10 進数値を使用しようとしましたが、コンパイル エラーが発生します。
.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 {}
美しくはありませんが、すべてのオプションを検討した結果、十分です。
この状況に遭遇したとき、属性のプロパティをDoubleとして公開することになりましたが、属性内ではそれらをDecimalのように扱いました。完璧にはほど遠いですが、単純なケースでは、それが必要なものかもしれません。
属性を使用したリアルタイムのトリックについては、TypeConverterクラスを使用しています。
次のコンストラクターを使用できます。C#コードに10進リテラルがある場合、C#コンパイラはこのコンストラクターへの呼び出しを発行します。
Decimal(Int32, Int32, Int32, Boolean, Byte)
編集:これは便利ではないことを私は知っています。