Có thể xem mã IL được tạo khi bạn gọi Biên dịch() trên cây Biểu thức không? Hãy xem xét ví dụ rất đơn giản này:Xem mã IL được tạo từ biểu thức được biên dịch
class Program
{
public int Value { get; set; }
static void Main(string[] args)
{
var param = Expression.Parameter(typeof(Program));
var con = Expression.Constant(5);
var prop = Expression.Property(param, typeof(Program).GetProperty("Value"));
var assign = Expression.Assign(prop, con);
Action<Program> lambda = Expression.Lambda<Action<Program>>(assign, param).Compile();
Program p = new Program();
lambda(p);
//p.Value = 5;
}
}
Bây giờ, cây biểu thức làm dòng cuối cùng của Main
nói. Biên dịch ứng dụng, sau đó mở nó trong Reflector. Bạn có thể thấy mã IL của p.Value = 5;
thực hiện nhiệm vụ. Nhưng cây biểu hiện được tạo và biên dịch trong thời gian chạy. Có thể xem mã IL kết quả từ biên dịch không?
Bạn chỉ muốn * tương đương * IL cho những gì bạn đang * làm * (ví dụ: thiết lập một tài sản)? Hay có điều gì đó về đầu ra 'Expression' mà bạn đặc biệt quan tâm? –
Không có gì cụ thể. Tôi thích nhìn vào mã IL theo thời gian. Nhưng với các biểu thức bạn có thể tạo ra một phương thức không nhận được bất kỳ IL nào trong assembly được biên dịch. IL sử dụng để * tạo * cây biểu thức đó, nhưng không phải là kết quả của việc biên dịch của cây biểu thức. Điều đó có ý nghĩa? Đây chỉ đơn giản là một sự tò mò và không phục vụ bất kỳ mục đích thiết thực nào mà tôi có thể nhìn thấy. – Amy
Bạn đã thử với công cụ ** LinqPad ** tuyệt vời chưa? http://www.linqpad.net/ Với nó, bạn có thể hiển thị mã được tạo ra như MSIL và thử nghiệm nhanh chóng gần như bất cứ điều gì ... – AFract