मैं एक पुन: प्रयोज्य फ़ंक्शन लिखना चाहता हूं जिसे मैं सभी स्थानीय चरों का स्नैपशॉट लॉग करने के लिए किसी भी विधि में कॉल कर सकता हूं। उदाहरण के लिए:सी # पुन: प्रयोज्य फ़ंक्शन स्थानीय चर के वर्तमान मूल्य को डंप करने के लिए
void somemethod()
{
int a = 1;
string s = "something";
dumpLocalVariables("step 1", MethodInfo.GetCurrentMethod(), this);
a++;
string t = s + "else";
dumpLocalVariables("step 2", MethodInfo.GetCurrentMethod(), this);
}
मैं इस तरह एक कंसोल आउटपुट प्राप्त करना चाहते हैं:
step 1
Int32 a = 1
String s = something
step 2
Int32 a = 2
String s = something
String t = somethingelse
मैं स्थानीय चर नाम की एक विशिष्ट सूची उपलब्ध कराने से बचना चाहते हैं।
निकटतम मुझे मिल सकता था MethodInfo.GetCurrentMethod().GetMethodBody().LocalVariables
, लेकिन मुझे नहीं पता कि प्रतिबिंब का उपयोग करके स्थानीय चर के मूल्यों का उपयोग कैसे किया जाए।
void dumpLocalVariables(string context, MethodBase currentMethod, object obj)
{
Console.WriteLine(context);
MethodBody methodBody = currentMethod.GetMethodBody();
foreach (LocalVariableInfo lvi in methodBody.LocalVariables)
{
string variableType = lvi.LocalType.Name;
// how do I get this?
string variableName = "variableNameHere";
// how do I get this?
string variableValue = "variableValueHere";
Console.WriteLine(" " + variableType + " " + variableName +
" = " + variableValue);
}
}
प्रतिबिंब API स्थिर विश्लेषण के लिए उपयुक्त है, लेकिन इस तरह गतिशील विश्लेषण के लिए नहीं। उदाहरण के लिए, dumpLocalVariables
पर पहली कॉल के दौरान चरम पर नहीं है, लेकिन यह MethodBody
की संपत्ति में अभी भी दिखाई देता है।
मुझे संदेह है कि एक डिबगिंग एपीआई है जिसे मैं देख रहा हूं। डेवलपर स्टूडियो ब्रेकपॉइंट पर "स्थानीय" टैब को कैसे पॉप्युलेट करता है? रनटाइम पर कुछ ऐसा करने का कोई तरीका है?
संपादित करें:
मैं ILSpy कि मेरे उदाहरण वर्ग ldloc.0 और ldloc.1 तरह आईएल कोड का उपयोग पहले और दूसरे स्थानीय चर करने के लिए प्राप्त करने के लिए देख सकते हैं।
.locals init (
[0] int32 a
[1] string s
[2] string t
)
और बाद में
IL_001b: ldloc.0 // this is a
IL_001c: ldc.i4.1
IL_001d: add
IL_001e: stloc.0
IL_001f: ldloc.1 // this is s
IL_0020: ldstr "else"
IL_0025: call string string::Concat(string, string)
IL_002a: stloc.2 // this is t
शायद मैं मुझे एक ही बात करने की सुविधा देता है कि प्रॉक्सी की तरह तंत्र किसी प्रकार का इस्तेमाल कर सकते हैं? मुझे कोई फर्क नहीं पड़ता कि मेरी पुन: प्रयोज्य विधि पर कॉल गन्दा है, मुझे बस कुछ चाहिए जो मैं बिना कोड-संपादन के किसी भी कोड ब्लॉक में पेस्ट कर सकता हूं।
के हिस्से के रूप GitHub पर उपलब्ध है "मुझे लगता है एक डिबगिंग एपीआई कि मैं अनदेखी कर रहा हूँ नहीं है": 'System.Diagnostics.Debugger' –
@Henk: आप स्पष्ट कर सकते हैं कि ? मुझे नहीं पता था कि 'डीबगर' वर्ग के पास 'IsAttached' और' Break() 'के अलावा कुछ भी उपयोगी था। – Groo
संभावित डुप्लीकेट: [क्या सी #? में रनटाइम पर स्टैक वैरिएबल की जांच करने का कोई तरीका है? (Http://stackoverflow.com/questions/5130414/is-there-a-way-to-examine-the-stack-variables -ट-रनटाइम-इन-सी), [सी # रनटाइम के दौरान सभी चर और वर्तमान मानों को कैसे डंप करें] (http://stackoverflow.com/questions/1552478/c-how-to-dump-all-variables-current- मान-दौरान-क्रम)। – Groo