2012-02-08 17 views
16

C#3または4でそれを行うことは可能ですか?多少の反省があるかもしれませんか?クラスのすべてのメソッドの前にメソッドを実行する

class Magic 
{ 

    [RunBeforeAll] 
    public void BaseMethod() 
    { 
    } 

    //runs BaseMethod before being executed 
    public void Method1() 
    { 
    } 

    //runs BaseMethod before being executed 
    public void Method2() 
    { 
    } 
} 

EDIT

このための代替ソリューションがあり、Magicシングルトンを作成し、静的インスタンスのゲッターにあなたのコードを置きます。これは私がやったことです:

public class Magic 
{ 

    private static Magic magic = new Magic(); 
    public static Magic Instance 
    { 
     get 
     { 
      magic.BaseMethod(); 
      return magic; 
     } 
    } 

    public void BaseMethod() 
    { 
    } 

    //runs BaseMethod before being executed 
    public void Method1() 
    { 
    } 

    //runs BaseMethod before being executed 
    public void Method2() 
    { 
    } 
} 
+4

コンストラクタはどうですか? – JConstantine

+1

コンストラクタを使うのは解決策ではありません。なぜなら、もし私が1つのインスタンスの2つのメソッドを実行していたら、一度実行するbasemethodしか得られないからです。また、静的インスタンスにはあまり適していません。 –

+0

これを行うには、 'dynamic'を使用し、[' IDynamicMetaObjectProvider'](http://msdn.microsoft.com/en-us/library/system.dynamic.idynamicmetaobjectprovider.aspx)を実装します。これにより、バインド中にメソッドを実行する前に発生する独自のコードを実行できます。注:この提案は好奇心として提供されています。それは実際にあなたの問題を解決する良い方法ではありません。 – Brian

答えて

7

このための代替ソリューションがありますMagicをシングルトンにし、コードを静的インスタンスのゲッターに配置します。それが私のしたことです。

public class Magic{ 

private static Magic magic; 
public static Magic Instance{ 
    get 
    { 
    BaseMethod(); 
    return magic; 
    } 
} 

public void BaseMethod(){ 
} 

//runs BaseMethod before being executed 
public void Method1(){ 
} 

//runs BaseMethod before being executed 
public void Method2(){ 
} 
} 
+0

これは興味深いようですが、うまくいかないでしょう。プライベートフィールドは開始されません。あなたが魔法のフィールドを開始する方法を説明するなら、これはうまくいくかもしれません。 – hakan

+0

lazy initを実行することができます。つまり、アクセスする前にヌルかどうかを確認することができます(通常は初回のみ)。それがあれば、それを導入する。 – CBinet

8

これはC#で自動的にはできません。おそらくAOPを見ているは​​ずです。 PostSharpとなります。あなたはAOPで行うことができます欲しい

+0

私はOPメソッドが1つのメソッド呼び出しの前にメソッドを実行し、後でそのメソッドを「使用」しなくてもいいと思っているので、これに対する解決策としてAOPに疑問があります。たぶん、_Initialized_のようなクラスインスタンスのフラグ、_true_の場合は、このアスペクトでは何もしませんか? –

+0

@MatíasFidemraizer:後のコメントに基づいて、私はそう信じていません: "コンストラクタを使うのは解決策ではありません。なぜなら、もし私が1つのインスタンスの2つのメソッドを実行するとすれば、 " - 私は、OPがこのメソッドを*毎回実行するようにしたいと考えています。 –

+0

さて、PostSharp(または他のAOPフレームワーク)が私たちのソリューションです!このコメントは私の疑問の後に出版されました。そして、私はこれが正解であると信じています。なぜなら、_IL weaving_はこの場合のプロキシ処理よりも優れているからです。 –

0

次の実装に動作しない理由だけの事を明確にする:

public class Magic{ 

private static Magic magic = new Magic(); 
public static Magic Instance{ 
    get 
    { 
    magic.BaseMethod(); 
    return magic; 
    } 
} 

public void BaseMethod(){ 
} 

//runs BaseMethod before being executed 
public void Method1(){ 
} 

//runs BaseMethod before being executed 
public void Method2(){ 
} 
} 

あなただけMagicオブジェクトを保持したい場合には、この方法は、ランダムに呼び出されます。

Magic m = Magic.Instance; //this will trigger unwanted call on BaseMethod 

と、一つはBaseMethodを呼び出したい場合は、それが二回呼び出されます。

もちろんGETを使用して不要なオブジェクトを返すために、回避策を持っている
Magic.Instance.BaseMethod(); //two calls of the BaseMethod 

var unused = Magic.Instance; 

のみ要約する:これは、C#に(少なくともまだ)できません。

関連する問題