web-dev-qa-db-ja.com

C#の属性パラメータとして10進値を使用しますか?

フィールド属性のパラメーターとして10進値を使用しようとしていますが、コンパイラエラーが発生します。

私はこのブログ投稿を見つけました link .Netではそれを使用することが不可能であったと言っていますが、なぜこれを選択するのか、または10進数のパラメーターをどのように使用できるのか誰かが知っていますか?

ありがとう。

77
rjlopes

これはCLRの制限です。属性パラメーターとして使用できるのは、プリミティブ定数またはプリミティブの配列のみです。その理由は、属性を完全にメタデータでエンコードする必要があるためです。これは、ILでコード化されているメソッド本体とは異なります。 MetaDataを使用しても、使用できる値の範囲が厳しく制限されるだけです。 CLRの現在のバージョンでは、メタデータ値はプリミティブ、null、タイプ、およびプリミティブの配列に制限されています(マイナーなものを見逃している可能性があります)。

基本型はプリミティブ型ではないため、メタデータで表すことができないため、属性パラメータになることができません。

115
JaredPar

私も同じ問題を抱えてる。 stringsの使用を検討します。これはタイプセーフではありませんが、読み取り可能であり、有効な数値を文字列に書き込むことができると思います:-)。

class BlahAttribute : Attribute
{
  private decimal value;

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

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

それは美しさではありませんが、すべてのオプションを検討した後、それで十分です。

14

この状況に遭遇したとき、属性のプロパティをDoubleとして公開することになりましたが、属性内ではそれらをDecimalのように扱いました。完璧とは程遠いですが、単純なケースでは、それだけで十分です。

2
ckittel

私が使用している属性を持つリアルタイムのトリックの場合 TypeConverter クラス。

1
Avram

次のコンストラクターを使用できます。 C#コードに10進リテラルがある場合、C#コンパイラはこのコンストラクターへの呼び出しを発行します。

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

編集:私はこれが便利ではないことを知っています。

0
Sam Harwell