2009-09-15 31 views
5

Điều này có liên quan đến câu hỏi về return type attributesanonymous classes, nhưng sau đó cho các phương thức ẩn danh (hoặc lambdas), nhưng đến nay tôi có thể tìm thấy câu hỏi chính xác này dường như chưa có trên stackoverflow.Cú pháp để áp dụng thuộc tính cho một phương thức ẩn danh?

Trong mã cho các thực thể kinh doanh mà chúng tôi tạo ra bằng CodeSmith, chúng tôi hiện có các thuộc tính [DebuggerNonUserCode], vì vậy chúng không được tính vào kết quả bảo hiểm mã. Thật không may, mã được tạo ra sử dụng các phương thức vô danh mà bây giờ vẫn hiển thị trong phạm vi mã với các tên như Class.<>c__DisplayClass3c vì cách này thực sự được trình biên dịch xử lý.

đang nhanh Ví dụ, với những cái tên và các loại thay đổi để bảo vệ những người vô tội, có thể nói:

public delegate T ReturnSomething<T>(); 

    public static T SafeCall<T>(T whenNotSupported, ReturnSomething<T> method) 
    { 
     T result; 
     try 
     { 
      result = method(); 
     } 
     catch (NotSupportedException) 
     { 
      result = whenNotSupported; 
     } 
     return result; 
    } 

    public static void CodeExample() 
    { 
     string foo = SafeCall<string>("OOPS!", delegate 
     { 
      //throw new NotSupportedException(); 
      return "Ok"; 
     }); 
    } 

Có cách nào để có được [DebuggerNonUserCode] thuộc tính bằng các phương pháp để chúng ta có thể thoát khỏi những tên đọc sai tên phương thức ẩn danh từ mã được tạo của chúng tôi từ kết quả bảo hiểm mã của chúng tôi? Hay chúng ta cần phải viết lại mã được tạo ra để không còn sử dụng các phương thức nặc danh nữa?

Đưa [DebuggerNonUserCode] trên method tham số của định nghĩa SafeCall phương pháp (trước kiểu ReturnSomething<T> tham số) không biên dịch và có lẽ sẽ không làm chính xác những gì chúng tôi muốn nếu nó sẽ. Sau đây cũng không biên dịch:

public static void CodeExample() 
    { 
     string foo = SafeCall<string>("OOPS!", [DebuggerNonUserCode] delegate 
     { 
      //throw new NotSupportedException(); 
      return "Ok"; 
     }); 
    } 

Tôi đã cố gắng để có một cái nhìn nhanh chóng tại CSharp Language Specification, nhưng đã không có bất kỳ may mắn tìm được một cú pháp mà sẽ cho phép áp dụng các thuộc tính với các phương pháp vô danh (hoặc lambdas) . Tôi đã bỏ lỡ nó, hoặc là điều này (hiện tại?) Không thể ...?

+0

Đừng nghĩ này sẽ được ưu tiên cao (nếu nó sẽ được thực hiện), nhưng tôi đã thêm gợi ý vào MS Connect tại https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID = 489925 – peSHIr

Trả lời

9

Bạn không thể, thật không may. Nó được liệt kê trên trang 401 của đặc tả ngôn ngữ C# 3.0:

Thuộc tính có thể được quy định tại phạm vi toàn cầu (để xác định thuộc tính trên chứa lắp ráp hoặc mô-đun) và cho type-tờ khai (§9.6) , tờ khai thành viên cấp lớp (§10.1.5), tuyên bố thành viên giao diện (§13.2), tuyên bố thành viên cấu trúc (§11.2), tuyên bố thành viên enum (§14.3), accessor- tờ khai (§10.7.2), khai báo sự kiện-accessor (§10.8.1), và danh sách tham số chính thức (§10.6.1).

+0

Cảm ơn, đó là tài liệu tham khảo tôi đang tìm kiếm. :-( – peSHIr

1

Thật không may C# không cho phép các thuộc tính được áp dụng cho các phương thức ẩn danh.

Bạn có chắc chắn rằng bạn thực sự muốn áp dụng thuộc tính DebuggerNonUserCode cho phương pháp ẩn danh này không? Phương thức mã người dùng và tôi nghĩ rằng bạn sẽ muốn có thể bước vào đó nếu cần.

+0

Như tôi đã nói, phương thức SafeCall cũng được gọi trong mã CodeSmith. Ở đó, chúng tôi muốn đặt '[DebuggerNonUserCode]' vào phương thức ẩn danh, vâng. – peSHIr

Các vấn đề liên quan