Доступ к 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
}