2015-10-14 103 views
1

我編寫了一個用於記錄方法異常的OnMethodBoundaryAspect屬性。PostSharp OnException。我如何獲得複雜參數的參數

我遇到了複雜的方法參數問題。

的方法簽名是:

識別TestClass m_tf =新識別TestClass();
m_tf.DoWorkInternal(1,new Prova1(){ProvaP1 = 10,ProvaP2 = 11});

我可以跟蹤int類型的第一個參數,所以我可以獲取參數名稱和值。
但是我怎樣才能得到屬性的值是一個複雜的對象的第二個參數?

在此先感謝。 朱塞佩。

已解決。

找到解決辦法。
縱橫方法是這樣的,寫JSON格式的目標方法參數:

public override void OnException(MethodExecutionArgs args) 
    { 
     base.OnException(args); 

     Dictionary<string, object> m_args = new Dictionary<string, object>(); 

     for (int i = 0; i < args.Arguments.Count(); i++) 
     { 
      string name = args.Method.GetParameters()[i].Name; 
      object obj = args.Arguments.GetArgument(i); 

      m_args.Add(name, obj); 
     } 

     var output = JsonConvert.SerializeObject(m_args); 

     : 
     : 
    } 

回答

0

雖然你可以把參數/參數數組字典和JSON序列化,另一種方法是隻要找到它直接使用該類型。

下面的代碼應該爲你做的伎倆。

public override void OnException(MethodExecutionArgs args) 
{ 
    Prova1 prova1 = null; 

    var parameters = args.Method.GetParameters(); 
    var arguments = args.Arguments 
    for (int i = 0; i < arguments.Count(); i++) 
    { 
     var param = parameters[i]; 
     var arg = arguments[i]; 
     if (param.ParameterType == typeof(Prova1)) 
     { 
      prova1 = arg; 
     } 
    } 

    var output = prova1; 

    // Do your magic 

    base.OnException(args); 
} 

另外,請記住兩件事。

  1. System.Linq函數應該能夠清除那個函數。
  2. 每當出現異常時,您都在參數列表中循環。但是,您的參數指數永遠不會改變。因此,您應該能夠計算複雜方法參數的索引一次(在CompileTimeInitialize()RuntimeInitialize()中)並重新使用該索引。