4

WCF 呼び出しをカスタマイズするために IOperationInvoker を実装しました。Invoke メソッドでは、OperationInvoker によって呼び出されるメソッドのカスタム属性にアクセスしたいと考えています。次のコードを書きました。ただし、そのメソッドで指定されているカスタム属性は提供していません。

public MyOperationInvoker(IOperationInvoker operationInvoker, DispatchOperation dispatchOperation)
{
            this.operationInvoker = operationInvoker;
}

public object Invoke(object instance, object[] inputs, out object[] outputs)
{
   MethodInfo mInfo=(MethodInfo)this.operationInvoker.GetType().GetProperty("Method").
                     GetValue(this.operationInvoker, null);
object[] objCustomAttributes = methodInfo.GetCustomAttributes(typeof(MyAttribute), true);

}
4

1 に答える 1

4

実行時に、OperationInvoker は MethodInfo を含むタイプ SyncMethodInvoker を持ちます。しかし、その保護レベルのために、OperationInvoker を SyncMethodInvoker にキャストすることはできません。ただし、OperationDescription には MethodInfo オブジェクトがあります。したがって、私が通常行うことは、IOperationBehavior.ApplyDispatchBehavior メソッドの MethodInfo を CustomOperationInvoker のコンストラクターに渡すことです。

public class OperationBehaviourInterceptor : IOperationBehavior
{
  public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
  {
    MethodInfo currMethodInfo = operationDescription.SyncMethod;

    var oldInvoker = dispatchOperation.Invoker;
    dispatchOperation.Invoker = new OperationInvokerBase(oldInvoker,currMethodInfo);
  }

  // other method
}

public class CustomOperationInvoker : IOperationInvoker
{
  private IOperationInvoker oldInvoker;
  private MethodInfo methodInfo;
  public CustomOperationInvoker(IOperationInvoker oldOperationInvoker, MethodInfo info)
  {
    this.oldInvoker = oldOperationInvoker;
    this.methodInfo = info;
  }

  // then you can access it 
}
于 2012-03-29T00:31:57.343 に答える