2012-01-06 23 views
12

Thuộc tính DebuggerStepThrough cho phép bạn bỏ qua đột nhập vào một số phương thức/lớp/thuộc tính nhất định.Có thể DebuggerStepThông qua được kế thừa vào việc triển khai IEnumerable được tạo tự động không?

Trong DebuggerStepThrough being ignored nó được làm rõ rằng trình biên dịch C# không kế thừa thuộc tính này vào trình biên dịch tạo ra thực hiện IEnumerable<T>.

Một ví dụ nhỏ của một sự thất bại đó là:

static void Main(string[] args) 
{ 
    var a = SkipMe().ToList(); 
} 

[System.Diagnostics.DebuggerStepThrough] 
static IEnumerable<int> SkipMe() 
{ 
    // comment out line below and the throw will be stepped over. 
    yield return 1; 
    throw new Exception(); 
} 

Có cách nào để có được trình biên dịch C# để thêm thuộc tính DebuggerStepThrough để tự động tạo ra gõ?

Có cách nào để phòng thu trực quan bỏ qua gỡ lỗi vào bất kỳ loại nào với thuộc tính [CompilerGenerated] không?

-

Phụ lục: một số ảnh chụp màn hình minh họa

Kết quả sau khi nhấn F5

screen 1

screen 2

Visual Studio Version:

snip 3

thuộc tính thiếu của chúng tôi:

the missing attribute

+0

cho những người tự hỏi tại sao, khi sử dụng Dapper chúng tôi đưa nó vào như một blob nguồn, tôi muốn tránh bước vào bất kỳ mã Dapper nào trong quá trình sử dụng thường xuyên và không muốn thêm dll vào dự án. –

+0

Tôi không thể hiểu được câu hỏi này. Trình biên dịch đã áp dụng thuộc tính [DebuggerHidden] cho các phương thức lớp lặp. Ví dụ trong đoạn mã không có ý nghĩa, trình gỡ rối luôn dừng lại trên một ngoại lệ không bị bắt buộc. Nhận xét trong phương thức SkipMe() không có ý nghĩa, nó không * không * bước qua câu lệnh ném. Ít nhất là không có trong VS2008, không thể biết bạn đang nói về phiên bản nào. –

+1

@hans vs 2010 .net 4, trình lặp chỉ có trình biên dịch được tạo, tôi đã kiểm tra trong phản xạ –

Trả lời

3

Tôi không nghĩ rằng có một cách để đạt được hiệu quả bạn đang tìm kiếm.

  • Không có cách nào để làm cho trình biên dịch C# sao chép thuộc tính này vào phương pháp tạo trạng thái máy.
  • Bạn không thể giải quyết vấn đề này bằng cách thêm DebuggerStepThrough vào lớp chứa phương thức trình lặp. Trình gỡ rối chỉ xem xét loại cha mẹ ngay lập tức không phải loại có chứa một loại lồng nhau.

Cách thực sự duy nhất tôi có thể nghĩ đến để đạt được điều này là đặt tất cả mã bạn không muốn gỡ lỗi vào trong một DLL riêng biệt. Sau đó, không tải PDB cho DLL cụ thể đó.

+1

cũng có một cách nữa ... bạn có thể PostSharp hoặc Mono.Cecil để tiêm thuộc tính trong một biên dịch phụ :) nhưng yeah ... đây là khá nhiều những gì tôi nghĩ. –

+0

@SamSaffron yes. Chắc chắn có thể thông qua một số loại bài viết IL viết lại quá trình. – JaredPar

+0

@SamSaffron có một cách khác: triển khai lớp liệt kê của riêng bạn, áp dụng thuộc tính ở đó và trả về một thể hiện của nó từ phương thức SkipMe. – phoog

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