2010-07-17 19 views

Trả lời

25

Cây biểu thức có nhiều điểm chung với (ví dụ) AST. Nó không ánh xạ trực tiếp đến mã, nhưng rất phù hợp để xây dựng từ các thuật toán. Ví dụ, nếu bạn đang phân tích một công thức:

((a + 2)/b) 

đó là:

ParameterExpression a = ..., b = ... 
var body = Expression.Divide(
    Expression.Add(a, Expression.Constant(2)), 
    b); 
var lambda = Expression.Lambda(body,a,b); // optionally with generics 

Trong thực tế, tôi đã làm chính xác này, sử dụng một bộ phân tích rằng xây dựng một cây đối tượng, với các đối tượng tạo hoàn thành expresion thông qua một "khách truy cập" thực hiện. Trong .NET 4.0, sự hỗ trợ cây biểu thức phong phú hơn có thể hỗ trợ hầu hết các kịch bản và biên dịch nó theo yêu cầu.

Một ứng dụng quan trọng của biểu thức là bạn có thể deconstruct họ khi chạy, vì vậy trong mã của bạn bạn có thể có:

Foo(x => x.SomeMethod(1, "abc")); 

và trích xuất các phương pháp SomeMethod-info, 1"abc", vv


bản đồ công khai . Đó là tất cả về các câu lệnh, v.v. rất tương tự như cách bạn viết mã thông thường. Việc sử dụng phổ biến nhất của codedom là để tạo mã, như là một phần của công cụ. Bạn có thể sử dụng nó để biên dịch động, nhưng thành thực mà nói thì khó hơn. Tôi không phải là người hâm mộ. Tính năng thú vị là cây mã số có thể hoạt động với nhiều ngôn ngữ.


Một ứng cử viên khác ở đây phải là DynamicMethod và/hoặc ILGenerator. Điều này không bản đồ đến một AST (biểu thức), và không thể được sử dụng để tạo mã nguồn (codedom), nhưng cho phép truy cập đầy đủ vào các công cụ MSIL. Tất nhiên, nó cũng đòi hỏi bạn phải suy nghĩ về ngăn xếp vv, nhưng nó là rất hiệu quả và hiệu quả cho lập trình meta.


Nếu ILGenerator là quá hard-core, và CodeDOM là một Pita, sau đó tùy chọn khác là thế hệ thời gian chạy của mã như là một chuỗi. Sau đó, vượt qua điều đó thông qua CSharpCodeProvider để biên dịch nó. Có một số phần của thời gian chạy lõi thực hiện điều này (XmlSerializer IIRC).


Vì vậy, để tóm tắt:

  • meta-lập trình: ILGenerator hoặc CSharpCodeProvider; cũng Expression trong 4.0 (nhưng điều này là khá hạn chế 3.5)
  • xử lý AST: Expression
  • phân tích trong thời gian chạy: Expression
  • mã thế hệ bằng nhiều ngôn ngữ: Mã-dom
0

Cây biểu thức được sử dụng để tạo biểu thức. Tạo mã nguồn khi chạy. CodeDom được sử dụng để biên dịch mã nguồn. Nó phải tồn tại trước khi bạn có thể xây dựng nó. Cây biểu hiện linh hoạt hơn, nhưng khó sử dụng hơn nhiều.

Nếu bạn muốn thêm tập lệnh vào ứng dụng của mình, hãy sử dụng CodeDom. Nếu bạn muốn làm phản chiếu rất tiên tiến và thích, sử dụng cây biểu thức, nhưng tôi không khuyên bạn nên sử dụng nó.