0

関数の入力パラメーターと出力パラメーターの両方にアクセスできるカスタム属性を作成する方法を考えていました。

以下は、私が達成したいことの例です

[CustomAttribute("Creating Foo")]
public Foo CreateFoo(Foo newFoo)
{
    //do logic
    return newlyCreatedFoo;
}

これから、「Creating Foo」タグを使用して DB にエントリを作成します。これは簡単に実行できますが、両方にCustomAttributeアクセスできるようにしたいと考えています。これは可能ですか?newFoonewlyCreatedFoo

4

3 に答える 3

4

通常、カスタム属性はそれを行うことができません。その目的は、リフレクション中に表示するメソッドにメタデータを追加することです。

そうは言っても、それを行うために属性が活用される場合があります。たとえば、ASP.Net MVC は IAuthorizationFilter を実装するカスタム属性を使用して、一部の Web ページにセキュリティを提供します。これが機能するのは、ASP がリフレクションを使用して最初にメソッドを起動しているためです。メソッドを取得すると、属性が IAuthorizationFilters であるかどうかを確認し、そうである場合は追加の作業を行います。詳細については、このリンクを参照してください。

これについて考えるもう 1 つの方法は、アスペクト指向プログラミングを検討することです。C# 用の AOP フレームワークは、特定のインターフェイスを実装する属性に基づいてメソッドをコンパイル時に装飾する傾向があると思いますが、私はそれを使用していません。

これに対処する私のお気に入りの方法は、古き良きProxyパターンです。ログ プロキシを作成します。

于 2012-11-30T14:36:39.253 に答える
1

残念ながら、これはカスタム属性では不可能です。

これは、コンパイル後の処理で実現できます。PostSharpなどのツールを使用すると、この機能を実現できます。

于 2012-11-30T14:24:08.570 に答える
0

おそらく、質問を「特定のメソッドへの呼び出しをインターセプトして引数をログに記録するにはどうすればよいですか」と言い換える必要がありますか?

カスタム属性は、メソッドの単なる装飾です。メソッドの実行を傍受したり、何らかの形で影響を与えたりすることはありません。アタッチされているメンバーすらわかりません。

呼び出しをインターセプトする場合は、依存性注入フレームワーク、または.NET用の他のAOPフレームワークを使用してそれを行うことができます。それらのいくつかは実際に属性を使用してターゲットをマークしますが、それは必須ではありません。

PostSharpは、.NET用のAOPフレームワークの1つにすぎません。

もう1つのオプションは、MEFなどのIoC /依存性注入ライブラリを使用して、すべての呼び出しをインターセプトし、特別な属性で装飾されたメソッドの値のみをログに記録するプロキシオブジェクトでクラスをラップすることです。

于 2012-11-30T14:39:22.660 に答える