我已经实现了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);
}
答案 0 :(得分:4)
在运行时,OperationInvoker的类型为SyncMethodInvoker,其中包含MethodInfo。但由于其保护级别,我们无法将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
}