2012-08-23 23 views
23

Tôi thích cách String.Format sử dụng đối số để chèn biến vào chuỗi mà nó định dạng. Điều này được gọi là Composite Formating và được thảo luận bởi MSDN here.Làm cách nào để tạo phương thức riêng của tôi tương tự như String.Format bằng cách sử dụng Định dạng hỗn hợp trong C#

Tôi muốn chức năng này với mặt tiền đăng nhập của tôi:

string foo = "fancy"; 
string bar = "message"; 
log.Debug("My {0} log {1}.", foo, bar) 

My ILoggerFacade có phương pháp chữ ký sau đây:

void Debug<T>(T message, params Object[] args); 

Và, tôi biết tôi có thể thực hiện điều này khá đơn giản:

ILog m_Log = \\some logging implementation 
public void Debug<T>(T message, params Object[] args) 
{ 
    m_Log.Debug(String.Format(message, args)); 
} 

Tuy nhiên, trong Visual Studio tôi không nhận được đánh dấu ưa thích của {0}, {1}, ... ar guments:

Argument highlighting for Composite Formatting methods

Tôi đoán nó là ReSharper người resposible cho họ, và nó có vẻ như nó chỉ được bỏ qua các đối số định dạng và đem lại cho không "IntelliSense" giúp đỡ. Điều này là không tốt vì các nhà phát triển khác, những người sẽ sử dụng mặt tiền sẽ mong đợi điều này.

Làm thế nào để làm nổi bật luận và "IntelliSense" cho các phương pháp định dạng tùy chỉnh tương tự như cách các công việc:

Console.WriteLine(...) 
String.Format(...) 
etc... 

Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

29

Khám phá các máy tái chế External Annotations. Cụ thể, bạn muốn sử dụng StringFormatMethodAttribute cho việc này.

Để sử dụng Chú thích bên ngoài, thực tế có 3 phương pháp. Hai thứ mà nó phát ra, và cái mà bạn phải đọc giữa các dòng để xem.

  1. Tham chiếu "JetBrains.Annotations.dll". Tôi sẽ khuyên bạn nên chống lại điều này. Tôi không thích ý tưởng sao chép DLL, hoặc phải tham khảo thư mục cài đặt ReSharper. Điều này có thể gây ra sự cố nếu bạn nâng cấp hoặc cài đặt lại.

  2. Sao chép và dán các khai báo thuộc tính vào giải pháp của bạn. Tôi khuyên bạn nên điều này vì nó mang lại cho bạn nhiều quyền kiểm soát hơn. Ngoài ra, bạn có thể loại bỏ ReSharper (tại sao mọi người lại làm điều này? Những điều lạ lẫm đã xảy ra, tôi đoán vậy.), Và vẫn cung cấp tính năng này cho bất kỳ ai tiêu thụ thư viện của bạn. Có hướng dẫn từng bước về cách thực hiện điều này trong liên kết đầu tiên.

  3. Tạo một tệp XML, tương tự như tệp mà nó sử dụng cho .NET Assembly. Tôi đã làm điều này cho Khung Kiểm tra Đơn vị Silverlight. Theo mặc định, ReSharper không nhận ra các thử nghiệm này.

    Để làm điều này

    1. Tạo một tên tập tin <assembly>.xml và đặt nó trong "ReSharper \ vXX \ Bin \ ExternalAnnotations".
    2. Thêm phần tử gốc "<assembly name="<assembly>">
    3. Bây giờ, thêm <member> yếu tố cho từng thành viên mà bạn muốn cung cấp thuộc tính.

    Tôi không khuyên bạn làm điều này cho mã của riêng bạn. Tuy nhiên, nếu bạn có một hội đồng mà bạn muốn có chức năng này, nhưng không thể chỉnh sửa, đây là cách để làm điều đó. Điều này sẽ chỉ áp dụng trên máy của bạn và mỗi nhà phát triển sử dụng lắp ráp sẽ cần phải sao chép tệp xml.

+2

Giới thiệu về cách thứ ba để thêm chú thích - bạn có thể đặt tệp chú thích xml gần lắp ráp, đặt tên nó là .ExternalAnnotations.xml và cam kết CVS của bạn. Tất cả các nhà phát triển khác sẽ tự động nhận được trong khi cập nhật. – derigel

+0

@derigel Cuộc gọi tốt. Tôi quên về điều đó. Tôi cá rằng bạn có thể làm một cái gì đó để bao gồm điều này trong một gói NuGet là tốt. Tuy nhiên tôi vẫn khuyên bạn nên chọn tùy chọn 2, nếu có. – cadrell0

+2

Để thực hiện bước 2 như được đề xuất: http://www.jetbrains.com/resharper/webhelp/Code_Analysis__Annotations_in_Source_Code.html – Oliver

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