2009-09-07 24 views
22

Pythonの関数デコレータのC#アナログはありますか?属性やリフレクションフレームワークではうまくいくと感じていますが、実行時に関数を置き換える方法はありません。関数デコレータ(C言語)#

Python decoratorsは、一般的にこのように動作:

class decorator(obj): 
    def __init__(self, f): 
     self.f = f 
    def __call__(self, *args, **kwargs): 
     print "Before" 
     self.f() 
     print "After" 

@decorator 
def func1(): 
    print "Function 1" 

@decorator 
def func2(): 
    print "Function 2" 

関数func1とfunc2のを呼び出すと、その後、アイデアはデコレータは私が簡単に入口と出口のポイントでの一般的なタスクを追加できるようになるということです

 
Before 
Function 1 
After 
Before 
Function 2 
After 

につながります複数の機能の

+0

私はこれをなぜ、何に反対するのかという興味深いイントロを見つけました。 http://python.about.com/gi/dynamic/offsite.htm?zi=1/XJ&sdn=python&cdn=compute&tm=12&f=10&su=p284.9.336.ip_p504.1.336.ip_&tt=29&bt=0&bts=1&zu=http %3A // www.python.org/doc/2.4.4/whatsnew/node6.html – ShuggyCoUk

+0

うーん、私は言語に既に組み込まれているものを期待していましたが、それは簡単な方法はないようですそれは新しいフレームワークを追加することなく。私のプロジェクトは非常に小さいので、それはおそらくそれをやりすぎるだろう。 – jtjin

答えて

9

これはPost Sharpを使用して行うことができます。手順については、デモビデオをご覧ください。

+1

ポストシャープはかなり素晴らしいですが、私の小さなプロジェクトにフレームワークを追加することは、私が関数デコレータを必要としていたためにちょっと残酷かもしれません。とにかくありがとうと:D – jtjin

+0

それは本当に単純な、参照を追加し、属性を継承しています。 –

+0

また、45日間の試用期間後に329ユーロの費用がかかります。 – Magnus

12

私はこれを達成するための方法は、Castle Dynamic ProxyようAOP frameworksSpring.NETあるいはPolicy Injection Application Blockています。

+0

AOPへのポインタをありがとう - 私の小さなプロジェクトにフレームワークを追加することは、少なくとも私がデコレータを最初に望んでいたものの、少し残酷かもしれないと思います。とにかくありがとう :) – jtjin

4

.NETフレームワークの "ContextBoundObject"でソートすることができます。 しかし、基本的には.net remotingインフラストラクチャを使用してメソッド呼び出しを傍受するため、ちょっと複雑です。 (呼び出しが同じアプリドメイン内にあるが、異なる「コンテキスト」を越えている場合は、ランタイムオーバーヘッドは最小です)。 より良いアプローチは、他のポスターによって上記のものになります。