6

現在、属性を使用しています。「属性引数は、定数式、typeof式、または属性パラメーターtypeの配列作成式である必要があります。」というエラーが頻繁に発生します。「定数式」が何を意味するのか、私にはよくわかりません。

属性にaを渡すことができればFunc<MyType, bool>(属性が存在するときに実行されるコードによって消費されるため)、非常に便利でした。しかし、残念ながら、違います。その型をアセンブリメタデータに配置できない理由がわかりません。これが、属性にその型を渡せない理由だと思います。

誰か私にアイデアを教えてもらえますか?

4

4 に答える 4

9

定数式は、コンパイル時にのみ決定される値であり、他の定数式の文字列連結、算術などが含まれます。

したがって、たとえば「」は定数式ですが、そうでString.Emptyはありません。

Stringnull以外の定数式をサポートする唯一の参照型です。値型の場合、プリミティブ型(intなど)と定数式をサポートします...ただし、CLRのプリミティブではないため、属性でdecimalは使用できません。(属性コンストラクターでパラメーター型としてdecimal指定することもできません。)decimal

詳細については、C#4仕様のセクション7.19を参照してください。

于 2012-05-04T08:55:40.183 に答える
4

属性は実際のデータとともにアセンブリに埋め込まれているため、コンパイラはコンパイル時に属性を作成できる必要があります(属性はコンパイラによってインスタンス化され、出力ファイルにシリアル化されます)。そのため、定数式が必要です。

基本的に、すべての基本的なデータ型(、など)を使用できintます。式は、型を識別するメタデータトークンに解決されるため、コンパイル時に問題 なく使用することもできます。boolstringtypeof

Func<MyType, bool>たぶん、あなたはあなたのタイプが実装するインターフェースにあなたの概念を入れることができます。または、式を使用して属性に渡すことができる別のハンドラークラスに入れますtypeof(MyHandlerClass)

于 2012-05-04T08:58:48.457 に答える
2

の属性C#コンパイル時のアーティファクトであるため、作成するには、定数型のパラメーター/マーカー/その他...

あなたがしていることをやろうとする可能性のある試みがあります。

C#の動的属性

于 2012-05-04T08:54:29.607 に答える
2

定数式は、コンパイル時に完全に評価できる式です。

http://msdn.microsoft.com/en-us/library/aa691319 (v=vs.71).aspx(古い記事ですがまだ有効です)

于 2012-05-04T08:55:25.097 に答える