2012-04-30 16 views
0

私はEvaluateAttributeを作成し、私はそれがこのように指定された様々なIEvaluatorの受け入れたい:CatEvaluatorDogEvaluatorがタイプなのでC#で型を受け入れる[属性]を持つにはどうすればよいですか?

[Evaluate(CatEvaluator, DogEvaluator)] 
public void someMethod() 
{ 
} 

を、私はこのように私の属性クラスを設定します。

public class EvaluateAttribute<T> : Attribute where T:IAccessEvaluator 

コンストラクタ:

public EvaluateAttribute(params T [] accessEvaluators) 
{ 
    _accessEvaluators = accessEvaluators; 
} 

C#ではgenericsとattrが似ていませんしかし、ibutes、それは見えるだろう。これには解決策がありますか?

各タイプをCreateInstanceでインスタンス化し、IAccessEvaluatorに固有の評価メソッドを実行します。

+0

はこれをチェックしてください: http://stackoverflow.com/questions/294216/why-does-c-sharp-forbid-generic-attribute-types グリーティング – MUG4N

+2

投稿する前にそれは解決策を含んでいないことがわかりました。 – NibblyPig

答えて

1

IAccessEvaluatorを実装するクラスを渡すだけの場合は、おそらくジェネリックを使用する必要はありません。署名を変更するだけです

public EvaluateAttribute(params IAccessEvaluator [] accessEvaluators) 
{ 
    _accessEvaluators = accessEvaluators; 
} 

質問を再入力してください。あなたはオブジェクトのような型を使っているので、私の最初の印象は上記の答えを書くことでした。タイプに注釈を付ける必要がある場合は、質問のコメントを参照する必要があります(MUG4Nによる)。

public EvaluateAttribute(params Type [] accessEvaluators) 
{ 
    _accessEvaluators = accessEvaluators; 
} 

[Evaluate(typeof(CatEvaluator), typeof(DogEvaluator)] 
public SomeClass{ } 

と属性受諾種類を停止することは何もありません_accessEvaluators

+0

しかし、 '[Attribute(CatEvaluator)]'は、 'CatEvaluator'はオブジェクトまたは同様のものとして使われる型です – NibblyPig

1

Type[]に変更する:あなたは、このように使用することができます

public class EvaluateAttribute : Attribute 
{ 
    private readonly Type[] _accessEvaluators; 

    public EvaluateAttribute(params Type[] accessEvaluators) 
    { 
     _accessEvaluators = accessEvaluators; 
    } 
} 

[Evaluate(typeof(CatEvaluator), typeof(DogEvaluator)] 
public void someMethod() 
{ 

} 

を不幸にし、あなたは型の安全性を失います - しかし、あなたはいつもそうすることができます私は実行時に属性のコンストラクタをチェックしています。線に沿って何か:

public EvaluateAttribute(params Type[] accessEvaluators) 
{ 
    foreach (var type in accessEvaluators) 
    { 
     if (!typeof(IAccessEvaluator).IsAssignableFrom(type)) 
     { 
      throw new InvalidOperationException("Suppied type must be of type IAccessEvaluator"); 
     } 
    } 
    _accessEvaluators = accessEvaluators; 
}