June 1, 2011, 7:29 p.m.
posted by bert
Accessing Local Variable InformationProblemYou are building a tool that examines code and you need to get access to the local variables within a method. SolutionUse the LocalVariables property on the MethodBody class to return an IList of LocalVariableInfo objects, each of which describes a local variable within the method:
public static IList<LocalVariableInfo> GetLocalVars(string asmPath,
string typeName, string methodName)
{
Assembly asm = Assembly.LoadFrom(asmPath);
Type asmType = asm.GetType(typeName);
MethodInfo mi = asmType.GetMethod(methodName);
MethodBody mb = mi.GetMethodBody();
IList<LocalVariableInfo> vars = mb.LocalVariables;
// Display information about each local variable.
foreach (LocalVariableInfo lvi in vars)
{
Console.WriteLine("IsPinned: " + lvi.IsPinned);
Console.WriteLine("LocalIndex: " + lvi.LocalIndex);
Console.WriteLine("LocalType.Module: " + lvi.LocalType.Module);
Console.WriteLine("LocalType.FullName: " + lvi.LocalType.FullName);
Console.WriteLine("ToString(): " + lvi.ToString());
}
return (vars);
}
The GetLocalVars method can be called using the following code:
public static void TestGetLocalVars()
{
Process current = Process.GetCurrentProcess();
// Get the path of the current module.
string path = current.MainModule.FileName;
// Get all local var info for the CSharpRecipes.Reflection.GetLocalVars method.
System.Collections.ObjectModel.ReadOnlyCollection<LocalVariableInfo> vars =
(System.Collections.ObjectModel.ReadOnlyCollection<LocalVariableInfo>)
GetLocalVars(path, "CSharpRecipes.Reflection", "GetLocalVars");
}
The output of this method is shown here: IsPinned: False LocalIndex: 0 LocalType.Module: CommonLanguageRuntimeLibrary LocalType.FullName: System.Reflection.Assembly ToString( ): System.Reflection.Assembly (0) IsPinned: False LocalIndex: 1 LocalType.Module: CommonLanguageRuntimeLibrary LocalType.FullName: System.Type ToString( ): System.Type (1) IsPinned: False LocalIndex: 2 LocalType.Module: CommonLanguageRuntimeLibrary LocalType.FullName: System.Reflection.MethodInfo ToString( ): System.Reflection.MethodInfo (2) IsPinned: False LocalIndex: 3 LocalType.Module: CommonLanguageRuntimeLibrary LocalType.FullName: System.Reflection.MethodBody ToString( ): System.Reflection.MethodBody (3) IsPinned: False LocalIndex: 4 LocalType.Module: CommonLanguageRuntimeLibrary LocalType.FullName: System.Collections.ObjectModel.ReadOnlyCollection`1[[System. Reflection.LocalVariableInfo, mscorlib, Version=2.0.0.0, Culture=neutral, Public KeyToken=b77a5c561934e089]] ToString( ): System.Collections.ObjectModel.ReadOnlyCollection`1[System.Reflectio n.LocalVariableInfo] (4) The LocalVariableInfo objects for each local variable found in the CSharpRecipes. Reflection.GetLocalVars method will be returned in the vars IList collection. DiscussionThe LocalVariables property can give you a good amount of information about variables within a method. The LocalVariables property returns an IList<LocalVariableInfo> collection. Each LocalVariableInfo object contains the information described in Figure.
See AlsoSee the "MethodInfo Class," "MethodBody Class," "ReadOnlyCollection<T> Class," and "LocalVariableInfo Class" topics in the MSDN documentation. |
- Comment