Neither reflection nor StackFrame provide features to grab runtime values.
However you can do some custom coding to retrieve these values e.g. I am
using params obj[] to provide logging functionality. Here is the sample code.
Thanks, Arif
////////////////////Sample code/////////////////////////////////
class Class1
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
//Sample One
int val = 10;
string name = "Arif";
BusinessFunction1(val,name);
//Sampe Two
int b = 10;
string name2 ="Test";
bool check = true;
BusinessFunction2(b,name2,check);
}
static void BusinessFunction1(int val, string name)
{
LogTrace(val,name);
}
static void BusinessFunction2(int b, string name2, bool
check)
{
LogTrace(b,name2,check);
}
public static void LogTrace(params object[] args)
{
StackTrace callStack = new StackTrace(1, true);
StackFrame callingMethodFrame =
callStack.GetFrame(0);
if (args == null || args.Length == 0)
{
Console.WriteLine("no parameters");
}
else
{
MethodBase callingMethod =
callingMethodFrame.GetMethod();
ParameterInfo[] parameters =
callingMethod.GetParameters();
int inParamCount = parameters.Length;
foreach (ParameterInfo parameter in
parameters)
if (parameter.IsOut) inParamCount--;
Debug.Assert(inParamCount == args.Length,
String.Format("Incorrect
number of arguments. Expected {0} but was {1}.", parameters.Length,
args.Length));
int paramCount = parameters.Length;
int argIndex = 0;
for (int i = 0; i < paramCount; i++)
{
Console.WriteLine(parameters[i].Name);
if (parameters[i].IsOut)
Console.WriteLine("<Unknown>");
else
{
if (args[argIndex] == null)
Console.WriteLine("<null>");
else
{
Console.WriteLine(args[argIndex].ToString().Trim());
}
argIndex++;
}
if (i < paramCount - 1)
Console.WriteLine(",");
}
}
}
}
"Jason Hales" wrote:
Hi, sorry it's not possible to get the values at runtime. If it is
possible then I don't know how you do it :-(
If it's any use you can get the stack trace and stack frames from the
System.Diagnostics:
using System.Diagnostics;
using System.Reflection;
try
{
MethodThatThrowsException("test");
}
catch(Exception ex)
{
StackTrace trace = new StackTrace();
Debug.WriteLine("Frame Count:" + trace.FrameCount);
for(int i = 0; i < trace.FrameCount; i++)
{
StackFrame frame = trace.GetFrame(i);
Debug.WriteLine("Frame " + i + " FileName:" + frame.GetFileName());
MethodBase method = frame.GetMethod();
Debug.WriteLine(" MethodName:" + method.Name);
ParameterInfo[] parameters = method.GetParameters();
Debug.WriteLine("Params: " + parameters.Length);
foreach(ParameterInfo param in parameters)
{
Debug.WriteLine(" Name: " + param.Name);
}
}