2012-04-09 6 views
5

私は以前のメソッドのIDictionary<string, object>という形でパラメータのリストを取得したいと考えています。一つのキャッチがあります。私がサードパーティ製のAspect Oriented Programmingフレームワークを無料で利用することはできません。例えばC#で呼び出された以前のメソッドのパラメータのIDictionary <string、object>を取得する方法は?

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 

namespace Question { 
    internal class Program { 
     public static void Main(string[] args) { 
      var impl = new Implementation(); 
      impl.MethodA(1, "two", new OtherClass { Name = "John", Age = 100 }); 
     } 
    } 

    internal class Implementation { 
     public void MethodA(int param1, string param2, OtherClass param3) { 
      Logger.LogParameters(); 
     } 
    } 

    internal class OtherClass { 
     public string Name { get; set; } 
     public int Age { get; set; } 
    } 

    internal class Logger { 
     public static void LogParameters() { 
      var parameters = GetParametersFromPreviousMethodCall(); 
      foreach (var keyValuePair in parameters) 
       Console.WriteLine(keyValuePair.Key + "=" + keyValuePair.Value); 
       // keyValuePair.Value may return a object that maybe required to 
       // inspect to get a representation as a string. 
     } 

     private static IDictionary<string, object> GetParametersFromPreviousMethodCall() { 
      throw new NotImplementedException("I need help here!"); 
     } 
    } 
} 

任意の提案やアイデア?必要に応じて反射を自由に使用してください。

+0

これは、リフレクションを必要としません。デバッガが必要です。 – Gabe

答えて

2

を得ることができます。

次の方法で名前を得ることができる:

var method = method.Name; 

MethodBase.GetParametersによってパラメータ。例えば

var dict = new Dictionary<string, object>(); 
foreach (var param in method.GetParameters()) 
{ 
    dict.Add(param.Name, param.DefaultValue); 
} 
+2

私はOPが渡された実際の値が欲しいと思います。 –

+0

私はそれがStackTraceから可能だとは思わないと思っていますhttp://stackoverflow.com/a/2147409/284240 –

2

私はあなたがAOPなしでできることは、StackFrameを使用し、呼び出されたメソッドを取得すると思います。

これはあまりにも多くのオーバーヘッドを必要とすると思います。変更した変数を渡した場合はどうなりますか?メソッド内で変更される前に元の値を格納するだけの余分なスペースを割り当てる必要があります。今、あなたは​​インスタンスを持っている

var trace = new System.Diagnostics.StackTrace(); 
var frame = trace.GetFrame(1); //previous 
var method = frame.GetMethod(); 

:それはあなたが必要なすべてを取得するためにStackTraceを使用することができます手から本当に速い

+2

jitコンパイラがインラインメソッドを持つことは言うまでもありません。 – phoog

関連する問題