2010-08-09 39 views
19

Tôi có một chức năng được sử dụng khi gọi một dịch vụ. Trước khi nó gọi cho dịch vụ, nó sẽ tạo ra một bản ghi:Thay thế cho loại lồng nhau loại Expression <Func<T>>

protected TResult CallService<TService, TResult>(TService service, 
    Expression<Func<TService, TResult>> functionSelector) 
{ 
    Logger.LogServiceCall(service, functionSelector); 
    return functionSelector.Compile()(service); 
} 

Visual Studio 2010 Mã Analyzer thông báo với tôi rằng tôi không nên sử dụng lồng nhau Gõ vào thông báo sau:

CA1006: Microsoft .Design: Xem xét một thiết kế nơi 'ServiceManager.CallService < TService, quả > (TService, Biểu < Func < TService, TResult > >) 012.không tổ chung loại 'Biểu thức < Func < TService, TResult > >'.

Mặc dù tôi chỉ có thể tạo quy tắc loại bỏ cho mục nhập này, có một sự thay thế tồn tại có thể ngăn hiển thị cảnh báo như vậy không?

Trả lời

25

Tôi sẽ ngăn chặn nó trong trường hợp này, với lý do mà người gọi không phải đối phó với generics lồng nhau, ông chỉ là đi qua một biểu thức lambda, đó là dễ sử dụng.

CA không đưa ra ngoại lệ cho các biểu thức lambda. Đôi khi Tốt hơn là nên nén nó sau đó viết mã lạ.

6

Tôi thành thật mà nói, tôi sẽ ngăn chặn that rule hầu hết thời gian. Trong khi tôi có thể hiểu rằng một số việc xây dựng các loại lồng nhau có thể tránh được, nó thường xuyên hơn không phải là trường hợp; bạn thường muốn để điều đó cho trang web cuộc gọi vì bạn không thể đảm bảo rằng trang web cuộc gọi sẽ muốn loại chung chung lồng nhau được khởi tạo theo cùng một cách.

Đây là một trong những quy tắc mà tôi thấy một chút hách; Tôi thường đồng ý với hầu hết trong số họ, nhưng không đồng ý với điều này.

0

Bạn có thể chặn cảnh báo tin nhắn bằng SuppressMessageAttribute.

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design","CA1006:<rule name>")] 
protected TResult CallService<...Snip... 
+2

Tôi hoàn toàn biết rằng, tôi đang tìm kiếm giải pháp thay thế. Mục đích của việc phân tích mã không phải là để ngăn chặn tất cả mọi thứ, nhưng cuối cùng tìm hiểu một cách tốt hơn. –

2

Các phương pháp như của bạn được sử dụng rộng rãi trong LINQ, ví dụ:

public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, 
    Expression<Func<TSource, bool>> predicate) 

Việc thay thế sẽ được tuyên bố một loại đại biểu để thay thế lồng nhau Func<TService, TResult>, nhưng đó là chỉ là khả năng nhầm lẫn giữa một nhiều nhà phát triển có kinh nghiệm đã từng làm việc với cây biểu đạt.

Microsoft rõ ràng tạo ngoại lệ cho CA1006 đối với các loại biểu thức chung lồng nhau, và chúng ta nên làm như vậy.

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