2012-04-09 16 views
5

मैं पिछली विधि के 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

से बाहर हो सकता है आप StackTrace का उपयोग आप सभी की जरूरत प्राप्त करने के लिए कर सकते हैं:

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

अब आप एक MethodBase उदाहरण है।

आप से नाम मिल सकता है:

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

मुझे लगता है कि ओपी चाहता है कि असली मान –

+0

में पारित हों, मुझे नहीं लगता कि यह स्टैकट्रेस http://stackoverflow.com/a/2147409/284240 से संभव है –

2

मुझे लगता है कि आप एओपी के बिना सबसे अच्छा कर सकते हैं StackFrame का उपयोग करें और जिस विधि को बुलाया गया था उसे प्राप्त करें।

मुझे कल्पना है कि इसके लिए बहुत अधिक ओवरहेड की आवश्यकता होगी। क्या होगा यदि आपने एक चर में पारित किया है जिसे आपने संशोधित किया है? विधि के भीतर संशोधित होने से पहले आपको मूल मूल्य को संग्रहीत करने के लिए अतिरिक्त स्थान आवंटित करना होगा। यही कारण है कि हाथ बहुत जल्दी

+2

उल्लेख नहीं है कि जिट कंपाइलर तरीकों को रेखांकित कर सकता है। – phoog

संबंधित मुद्दे