2011-08-08 25 views
4

我實現了IOperationInvoker來定製WCF調用。 Invoke方法我想訪問由OperationInvoker調用的方法的自定義屬性。 我寫了下面的代碼。 但是,它沒有給出在該方法上指定的自定義屬性。在IOperationInvoker實現中訪問MethodInfo

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

在運行時,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 
}