フィールド属性のパラメーターとして10進値を使用しようとしていますが、コンパイラエラーが発生します。
私はこのブログ投稿を見つけました link .Netではそれを使用することが不可能であったと言っていますが、なぜこれを選択するのか、または10進数のパラメーターをどのように使用できるのか誰かが知っていますか?
ありがとう。
これはCLRの制限です。属性パラメーターとして使用できるのは、プリミティブ定数またはプリミティブの配列のみです。その理由は、属性を完全にメタデータでエンコードする必要があるためです。これは、ILでコード化されているメソッド本体とは異なります。 MetaDataを使用しても、使用できる値の範囲が厳しく制限されるだけです。 CLRの現在のバージョンでは、メタデータ値はプリミティブ、null、タイプ、およびプリミティブの配列に制限されています(マイナーなものを見逃している可能性があります)。
基本型はプリミティブ型ではないため、メタデータで表すことができないため、属性パラメータになることができません。
私も同じ問題を抱えてる。 stringsの使用を検討します。これはタイプセーフではありませんが、読み取り可能であり、有効な数値を文字列に書き込むことができると思います:-)。
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)
編集:私はこれが便利ではないことを知っています。