1

マーカーインターフェイスの代わりにカスタム属性をコーディングしています

public class FooAssignableAttribute : Attribute  
{ 
    ... 
} 

[FooAssignable] 
public class Foo  
{     
   ... 
} 

このような辞書をコーディングすることはできませんか?

Dictionary<string, FooAssignable> dictionary;

マーカーインターフェイスを避けて、カスタム属性を使用しようとしています。上記のコードを記述できないのはなぜですか?

4

4 に答える 4

2

いいえ、これは機能しません。C#のジェネリックコレクション(または他のジェネリック)のパラメトリック型は宣言可能な型である必要があり、属性はメタデータとしてのみ存在します。

FooAssignableタイプのオブジェクトを持つことはできません。FooAssignable属性を持つオブジェクトを持つことができますが、これはスーパータイプとして持つことと同じではありません。FooAssignableはクラスまたはインターフェイスではなく、有効な型指定子ではありません。FooAssignableAttributeはですが、これは属性自体を参照するタイプであり、その属性でタグ付けされたアイテムではありません。

ディクショナリでは、インデクサのoutタイプは指定したoutタイプであると考えてください。ただし、FooAssignable型の変数を使用することはできません。FooAssignableでタグ付けされた型の変数を使用することはできますが、これらすべての型に適合する単一の基本クラスはありません。その型宣言は違法であるため、このディクショナリは、他の多くの場所の中でも、インデクサーからのゲッターの戻り型として、違法で存在しない型を持ちます。AC#タイプチェックは、属性プレゼンスチェックを備えた汎用メカニズムを介して自発的に置き換えることはできません。

型システムにチェックさせたいものはすべて、型システムの一部である必要があります。属性評価は型を定義しないため、型システムはこれを行うことができません。一方、ジェネリックスは、型システムと最も直接相互作用する言語の一部です。このようなチェックを実行するには、実際に型システムを通過する必要があります。これは、代わりにFooAssignableAttributeをインターフェイス(IFooAssignable?)にプロモートすることを意味します。

于 2012-01-27T23:11:30.160 に答える
1

FooAssignableAttributeクラスの名前です。コードでクラスを参照する場合は、その名前を使用する必要があります。

末尾の「」を省略した省略形は、上記の例のように、属性としてAttribute使用している場合にのみ機能します。クラスとして(たとえば、変数宣言やジェネリック型引数として)使用する場合は、そのクラス名を使用する必要があります。[FooAssignable]

于 2012-01-27T23:06:37.110 に答える
1

クラス名を変更するだけです(可能な場合):

public class FooAssignable : Attribute
{ ... }
于 2012-01-27T23:07:26.703 に答える
0

独自のスタイルガイドと一貫性を保つか、存在するスタイルガイドを選択してください。

于 2012-01-27T23:09:58.430 に答える