2016-03-25 10 views
2

私はthis questionを見つけました - これは私が試みているものに非常に似ています。しかし、私のユースケースは少し異なります。C#属性はメソッドにパラメータを追加できますか?

ビジネスサービスの監査履歴を保存する必要があります。しかし、メソッド呼び出しの前後で、単に監査チェックポイントを手動で呼び出せるようにする必要があります。

私たちはこのプロジェクトでCastle.Coreを使用しています。これを達成するために私はサービスメソッド(ビジネスロジックの監査など)に使用するAuditContextというカスタム属性を作成する予定です。Castle DynamicProxyを使用して、メタデータに基づいて新しいコンテキストオブジェクトを作成するロギングプロキシを作成する予定です属性オブジェクトの引数私がしたいのは、メソッドの引数としてこのオブジェクトをメソッドに挿入することですが、作成する各サービスメソッドにAuditContextパラメータを指定する必要はありません。基本的に

、これに代えて:

[AuditContext(someStaticMetadata) 
public BusinessObject BusinessMethod (AuditContext context, ...arguments) { 
    // ...some logic... 
    context.checkpoint(someAuditData); 
} 

私はこれを行うことができるようにしたい:

[AuditContext(someStaticMetadata) 
public BusinessObject BusinessMethod (...arguments) { // We do not have to specify the context object for every business method... 
    // ...some logic... 
    context.checkpoint(someAuditData); // ...but the object is still available, as the parameter has been added by the argument. 
} 

あるいは、より多くの一般的な例を作るために、私はこれを書きたいです

[ProvidesParam2] 
public Object myFunc (param1) { } 

...この署名のある関数で終了します。

public Object myFunc (param1, param2) { } 

蒸留された質問は次のとおりです。 - C#属性は、デザイン時にメソッドのシグネチャを効果的に変更する、装飾するメソッドにパラメータを追加できますか?

ありがとうございます!

+0

あなたが尋ねていることとあなたがリンクしている質問への答えとの間の唯一の違いは、 'AuditContext'が静的メタデータを取るのに対し、リンクされた質問の答えはインターフェースを取ることです。いずれにしても、リフレクションを使用してオブジェクトをインスタンス化する必要があります。質問していることがリンクされている質問とどのように違うのかを私に説明することができない限り、私は重複して閉じるために投票するつもりです。 –

+0

@ JimMischel彼がやっていることと私がやっていることの主な違いは、メソッドのシグネチャを変更するために属性を使用しようとしていることです。実際には、私はそれが重複していないことを示すためにのみ質問を提供しました。私のユースケースは彼に関連していますが、基本的な問題は異なります。私が提供したコードサンプルを参照してください。 –

+0

'someAuditData'をパラメータとして渡すことなく' someAuditData'を取得する唯一の方法は、リフレクションを使用して 'AuditContext'属性を見つけて、それをインスタンス化する' Activator.CreateInstance'を、リンクされた質問言った。まるでそれがパラメータであるかのようにアクセスすることはできません。 –

答えて

2

短い回答:いいえ。アトリビュートは実際に(呼び出し規約のような)特別な場合にシグネチャとして解釈できるものを変更しますが、引数リストを変更することはできません。カスタムILリライタを使用して、あなたが望むものを達成することができます。 PostSharpのようなものが役立つかもしれません(免責事項:私はPostSharpを使用したことで全く経験がありません)。

関連する問題