Доступ к MethodInfo в реализации IOperationInvoker

Я реализовал IOperationInvoker для настройки вызова WCF. В методе 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);

}

1 ответ

Во время выполнения OperationInvoker имеет тип SyncMethodInvoker, который содержит MethodInfo. Но из-за его уровня защиты мы не можем привести OperationInvoker к SyncMethodInvoker. Однако в OperationDescription есть объект MethodInfo. Поэтому я обычно передаю MethodInfo в методе IOperationBehavior.ApplyDispatchBehavior в конструктор 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 
}
Другие вопросы по тегам