Nếu tôi có một mã như thế này:Tại sao không thể lấy tên biến cục bộ bằng Reflection?
public class Program
{
public static void Main()
{
string bar = "";
int foo = 24;
}
}
tôi có thể nhận được các biến địa phương khai báo trong Main
sử dụng:
var flag = BindingFlags.Static | BindingFlags.Public;
var fields = typeof(Program).GetMethod("Main", flags).GetMethodBody().LocalVariables;
này trả về một IList<LocalVariableInfo>
và LocalVariableInfo
chỉ có ba đặc tính: IsPinned
, LocalIndex
và LocalType
. Do đó không có tài sản Name
nào tồn tại.
Những gì tôi đang tự hỏi là bạn có thể nhìn thấy tên biến trong tạo IL code
:
.method public hidebysig static void Main() cil managed
{
.entrypoint
// Code size 11 (0xb)
.maxstack 1
.locals init ([0] string bar,
[1] int32 foo)
IL_0000: nop
IL_0001: ldstr ""
IL_0006: stloc.0
IL_0007: ldc.i4.s 24
IL_0009: stloc.1
IL_000a: ret
} // end of method Program::Main
nhưng nó không phải là khả năng để có được chúng sử dụng Reflection
.là nó bởi vì các biến địa phương không có một tên và chúng chỉ được truy cập bởi các chỉ mục của chúng (nếu như vậy cách ILDASM.exe
hiển thị tên?) hoặc do tính năng này không được triển khai? Hoặc nếu có thể sử dụng một cách khác thì câu hỏi sẽ là, cách?
Lưu ý: Tôi đã thấy một số câu hỏi như this và hầu hết trong số họ đang sử dụng Expressions
để nhận tên biến. Nó không hoạt động nếu tôi muốn có được tất cả người dân địa phương bao gồm các biến tạm thời do trình biên dịch tạo ra.
Tên có mặt sau khi xóa các tệp PDB không? – dasblinkenlight
@dasblinkenlight, nhưng tôi thấy các tên tạm thời như V_0 và V_1 thay vì tên thực tế –