0

を作成しましたが、次のように指定されEvaluateAttributeたさまざまな を受け入れるようにします。IEvaluator

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

CatEvaluatorとは型であるためDogEvaluator、属性クラスを次のように設定します。

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

そしてコンストラクタ:

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

ただし、C#はジェネリックと属性が好きではないようです。これに対する解決策はありますか?

属性を で各型をインスタンス化し、 にCreateInstance固有の evaluate メソッドを実行する必要がありますIAccessEvaluator

4

2 に答える 2

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し ますType[]

于 2012-04-30T10:29:57.120 に答える
1

型を受け入れる属性を止めるものは何もありません:

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;
}
于 2012-04-30T10:37:27.603 に答える