2011-01-18 23 views
6

Hãy xem xét các biểu thức sau:Heuristic cho "này" và đóng cửa OK? (Cây Expression)

class A { 
    int x; 
    public void Method(int y) { 
     Expression<Func<bool>> expr=() => x == y; 
     //... 

Ở đây, khái niệm liên quan đến một kết thúc tự động tạo cho y, và một tham chiếu đến this loại A cho (implicit) this.x. Cả hai sẽ được biểu diễn dưới dạng MemberExpression trên một số ConstantExpression trong cây biểu thức. Với biểu thức như expr hoặc biểu thức phức tạp hơn với tham chiếu này và/hoặc đóng, Tôi muốn xác định rằng ConstantExpression cụ thể thực sự là "này" hoặc được đóng hoàn toàn để có thể tạo lại C# từ cây biểu thức (ExpressionToCode).

Tôi đã xây dựng một "giải pháp" bằng cách sử dụng một số chẩn đoán vì không có vẻ là một giải pháp hoàn hảo.

  • Đóng cửa và this trong lambda luôn ở ConstantExpressions.
  • Đóng cửa và this không bao giờ là null.
  • Cả hai đều là các lớp, không phải loại giá trị - bạn không thể chụp tham chiếu đến this từ cấu trúc. Điều đó khá may mắn, bởi vì việc nói default(StructType).Method() từ this.Method() nếu không sẽ không thể thực hiện bất cứ khi nào this == default(StructType).
  • loại Builtin (string, Enums, số thập phân, Type, tất cả nguyên thủy) là hằng số thực sự thực, không this hoặc đóng cửa
  • đóng cửa và các loại Anonymous bắt đầu với < và được chú thích với CompilerGeneratedAttribute
    • tên Đóng chứa chuỗi DisplayClass, các loại ẩn danh chứa AnonymousType
    • Loại ẩn danh là chung chung, không được đóng.
    • Đóng cửa là các lớp lồng nhau, các loại ẩn danh thì không.
  • this phải là loại bình thường: không CompilerGenerated và không bắt đầu với <

Có phải chẩn đoán trên đủ để phân biệt giữa các hằng số thực, this, đóng cửa và các loại vô danh? I E. có những trường hợp mà các chẩn đoán này không thành công, hoặc tôi có thiếu sót gì không? Điều này có khả năng phá vỡ trong các phiên bản .NET trong tương lai không?

Chỉnh sửa: Tôi lần đầu tiên đặt câu hỏi này theo kiểu mở, không có kết quả; Tôi viết lại câu hỏi để bao gồm những gì tôi đã đưa ra cho đến nay. Bất cứ đề nghị nhiều đánh giá cao - hết hạn vào ngày mai của tiền thưởng, bất kỳ ý tưởng nào cả được chào đón ...

+0

Bạn có chắc chắn giả định của bạn là chính xác không? Theo ý kiến ​​của tôi (tôi không phải là một chuyên gia;), x trong biểu thức chỉ có thể là một tham chiếu đến một int mà không có kiến ​​thức về A (và không có cách nào để tìm về A từ biểu thức) – Guillaume86

+0

ok Tôi sai có thể với cây biểu hiện (và hiển nhiên là ^^) – Guillaume86

+0

Tôi chắc chắn rằng có thể đến gần câu trả lời. Tôi không chắc là nó có thể - tôi đã thêm những suy nghĩ hiện tại của tôi về vấn đề, bạn cần phải phát hiện và phân biệt giữa các loại trình biên dịch tạo ra, hằng số thực và kiểu người dùng - và lưu ý rằng trình biên dịch cũng tạo ra vô danh các loại không dành cho đóng cửa. –

Trả lời

2

Ok, tôi quản lý để tìm về Type A từ biểu thức:

class Program 
{ 
    class A 
    { 
     int x; 
     public Expression<Func<bool>> Method(int y) 
     { 
      Expression<Func<bool>> expr =() => x == y; 
      return expr; 
     } 
    } 

    static void Main(string[] args) 
    { 
     var expr = new A().Method(10); 

     dynamic body = expr.Body; 

     A instance = body.Left.Expression.Value; 

     Console.Write(instance.ToString()); 

     Console.ReadKey(); 
    } 
} 

Các động chỉ là để đi Nhanh.

chỉnh sửa 2: đã nhận được

+0

Những gì bạn đang làm ở đây hoạt động trong * ví dụ chính xác này * - nhưng nó sẽ không hoạt động nói chung. Tôi in đậm phần liên quan của câu hỏi liên quan đến thực tế rằng đó là một biểu thức * tùy ý *, và thêm một chút làm rõ về lý do tại sao và làm thế nào mà điều này có thể đạt được - cảm ơn vì đã tìm kiếm! –

+0

Tôi sợ những gì bạn muốn làm là không thể, từ quan điểm biểu hiện của xem, không có sự khác biệt giữa một 'ngầm' đóng cửa và một 'rõ ràng' một ... – Guillaume86

+0

Bạn có ý nghĩa gì - đóng cửa rõ ràng? Đóng cửa luôn luôn tiềm ẩn; và AFAIK họ tạo ra các lớp học với 'DisplayClass' trong tên - ít nhất đó là một phần của heuristic tôi đang sử dụng cho đến nay. –