4

を使用して、インターセプトされたクラスで別のメソッドを呼び出せるようにしたいと考えていますPostSharp

私のPostSharp側面に次の方法があるとします:

    public override void OnInvoke(MethodInterceptionArgs args)
    {
        if (!m_featureToggle.FeatureEnabled)
        {
            base.OnInvoke(args);
        }
        else
        {
            var instance = args.Instance;
            instance.CallDifferentMethod(); //this is made up syntax
        }  
    }

これCallDifferentMethod()は、インターセプトされたクラス内の別のメソッドです。リフレクション マジックを実行して、呼び出したい名前を取得できますが、クラスのこのインスタンスでそのメソッドを呼び出す方法がわかりません。クラスの新しいインスタンスを起動したくない

助言がありますか?

4

1 に答える 1

3

args.Instace を型にキャストしていますか? あなたが書いたことに基づいて、「FeatureEnabled」はインターフェイスを介して定義する必要があると思います。

public interface IHasFeature
{
  bool IsFeatureEnabled { get; set; }
  void SomeOtherMethod();
}

次に使用します

((IHasFeature)args.Instance).SomeOtherMethod(); 

次に、そのインターフェイスにアスペクトを適用します。

[assembly: MyApp.MyAspect(AttributeTargetTypes = "MyApp.IHasFeature")]

またはインターフェイスで直接

[MyAspect]
public interface IHasFeature

更新: おっと、Gael は正しいです。申し訳ありません。CompileTimeValidate メソッドを使用して、コンパイル時にアスペクトを制限します。

public override bool CompileTimeValidate(System.Reflection.MethodBase method)
        {
            bool isCorrectType = (Check for correct type here)
            return isCorrectType;
        }

詳細については、私の投稿http://www.sharpcrafters.com/blog/post/Day-9-Aspect-Lifetime-Scope-Part-1.aspxを参照してください。

于 2012-06-11T00:40:09.487 に答える