2012-03-26 22 views
9

Bất cứ khi nào tôi gọi trình ghi nhật ký của mình theo một phương pháp, ví dụ:Tôi có thể chặn tất cả các thông báo phân tích mã cho một lớp nhất định không?

_logger.Debug("Connecting to database..."); 

tôi nhận được cảnh báo:

CA1303 : Microsoft.Globalization: 
Method 'Database.Connect()' passes a literal 
string as parameter 'message' of a call to 'ILogger.Debug(string)'. 
Retrieve the following string(s) from a resource table instead: 
"Connecting to database...". 

Có cách nào để ngăn chặn cảnh báo này mỗi khi tôi sử dụng một chức năng của ILogger? Tôi thực sự không muốn ngăn chặn nó trong mọi phương pháp tôi đang sử dụng nó.

+0

Hoặc, bạn có thể nhận được các chuỗi từ một bảng tài nguyên thay vào đó và sau đó bạn sẽ không có bất kỳ cảnh báo nữa? – Msonic

+0

Tôi biết, nhưng tôi không muốn làm điều đó cho các thông điệp tường trình. – xsl

+0

Tiền tố chuỗi bằng @ để đánh dấu nó là chữ, .Debug (@ "Kết nối với cơ sở dữ liệu ...") –

Trả lời

3

Không phân tích mã FxCop/VS cũng như quy tắc CA1303 có thể định cấu hình để bỏ qua các mục tiêu cụ thể theo cách này. Về cơ bản bạn có ba tùy chọn:

  1. Suppress các vi phạm cá nhân,
  2. Vô hiệu hoá các quy định, hoặc
  3. thay thế quy tắc tùy chỉnh mà ứng xử theo cách bạn muốn.

Tôi có xu hướng nghiêng về thứ 3, nhưng ymmv ... Ngoài ra, nếu bạn cảm thấy mạnh mẽ rằng bạn có thể kiểm soát hành vi CA1303, đây là điều cần xem xét yêu cầu tại https://connect.microsoft.com/VisualStudio hoặc http://visualstudio.uservoice.com/forums/121579-visual-studio.

1

Nếu bạn áp dụng thuộc tính GeneratedCode cho một lớp, Phân tích mã sẽ không phân tích lớp của bạn.

3

Tôi đã gặp sự cố này và thấy rằng giải pháp đơn giản nhất là đổi tên tham số của phương thức ghi nhật ký của tôi từ "tin nhắn" sang thông báo khác.

CA1303 sẽ chỉ kích hoạt nếu thông số hoặc tên thuộc tính có liên quan có chứa "Văn bản", "Tin nhắn" hoặc "Chú thích". Nếu thông số được chuyển đến Console.Write hoặc Console.WriteLine, thông số cũng không thể được đặt tên là "giá trị" hoặc "định dạng".

+0

Cảm ơn. Trong khi tôi nghĩ rằng giải pháp thích hợp là sử dụng '[Localizable (false)]', System.ComponentModel.LocalizableAttribute là tiếc là không có sẵn trong Portable Class Libraries. Vì vậy, đối với tôi, thay đổi tên tham số từ 'message' thành' logMsg' đã giải quyết được nó (sau đó tôi đã phải loại bỏ CA1704: IdentifiersShouldBeSpelledCorrectly trong giao diện đăng nhập). – hlovdal

13

Nếu bạn kiểm soát giao diện ILogger, bạn có thể tận dụng thuộc tính Localizable với giá trị sai để cho biết giá trị không thể định vị được.

Ví dụ:

void Info([Localizable(false)] string message); 
+1

Chính xác những gì cần thiết. Nên được đánh dấu là câu trả lời. –

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