14

システムのセキュリティをチェックし、セキュリティ エラーが発生した場合に認証例外をスローするカスタム属性クラスを作成しました。

public class EntityChecker: System.Attribute
{
    public EntityChecker(int entityId)
    {
        // doing some logic to check if the entityId is allowed to be inserted
    }
}

このカスタム属性をエンティティ追加関数の宣言として使用し、関数から属性コンストラクターに変数を渡したいと考えています。このようなことができるでしょうか?

[EntityChecker(entityId)]
public int AddNewEntity(entityId)
{
 // logic of entity addition
}
4

2 に答える 2

13

こんなことができるのか!?

いいえ。属性のコンストラクタ パラメータは、コンパイル時に解決する必要があります。これらは、型またはメソッド自体のメタデータとして意図されており、呼び出しごとまたはインスタンスごとに使用されるものではありません。

あなたの説明を考えると、属性はこれを処理する適切な方法ではない可能性があります。呼び出しごとに発生する追加のコードを実行する必要があるため、別の手法が必要になります。たとえば、次のようにデリゲートを渡すことができます。

public int CheckedAddEntity(int entityId, Func<int, int> funcToAdd)
{
    // Perform your checking on entityId here
    return funcToAdd();
}

これにより、次のような方法で呼び出すことができます。

int result = CheckedAddEntity(entityId, AddNewEntity);
于 2012-10-29T15:52:51.990 に答える
1

この場合、アスペクト指向プログラミングを検討することをお勧めします。これはコードを実行する別の方法ですが、ボイラープレート ロジック (認証など) を全体で再利用できる方法です。属性を少し異なる方法で設計する必要があるかもしれませんが、すべてのロジックを「アスペクト」に入れることができ、プロジェクトをビルドするときにコードに自動的にコンパイルされます。

私は個人的に PostSharp を使用していますが、他にもあることは知っています。開発に使用できる無料のライセンスがあります。高度な機能を必要としない限り、非常に費用対効果が高くなります。

http://www.postsharp.net/blog/post/5-Ways-That-Postsharp-Can-SOLIDify-Your-Code-Authorization

于 2012-10-29T16:13:41.580 に答える