2011-09-14 28 views
37

Tôi có một đối tượng với phương thức tùy chỉnh WriteLine(string). Một cái gì đó như thế này:Làm thế nào để bắt chước string.Format() theo phương pháp của riêng tôi?

public void WriteLine(string text) 
{ 
    this.StringList.Add(text); 
} 

Cách dễ nhất để sao chép chức năng của string.Format() bằng phương pháp này là gì? Ví dụ: Những gì tôi hiện thường thấy mình làm điều này là:

myObj.WriteLine(string.Format("Hello, {0}", name)); 

Nếu bạn tạo một ứng dụng Console mới phiên bản của họ về một phương pháp WriteLine() thực hiện chính xác những gì tôi muốn làm:

Console.WriteLine("Hello, {0}", name); 

Họ loại bỏ sự cần thiết phải gọi string.Format(). Có dễ dàng để làm cho phương pháp của bạn chấp nhận điều này bằng cách nào đó? Hoặc tôi sẽ phải tạo ra một ngàn phương pháp quá tải? Một cái gì đó như thế này:

public void WriteLine() { ... } 

public void WriteLine(string text) { ... } 

public void WriteLine(string text, object arg0) { ... } 

public void WriteLine(string text, object arg0, object arg1) { ... } 

public void WriteLine(string text, object arg0, object arg1, object arg2) 
{ 
    this.StringList.Add(string.Format(text, arg0, arg1, arg2)); 
} 

// etc etc etc 

Đó có phải là cách hợp lý duy nhất để thực hiện việc này không? Mọi đề xuất đều được hoan nghênh :)

+1

Tại sao không chỉ ủy quyền cho 'string.Format'? Bạn có thực sự muốn viết một tokenizer? – Oded

+10

Có một tính năng của C# mà bạn không biết về điều bạn cần biết. http://msdn.microsoft.com/en-us/library/w5zay9db(v=VS.100).aspx –

+0

@Đó là câu hỏi của tôi ... Tôi không biết từ khóa 'params' và không biết rằng tôi thậm chí *** có thể *** ủy quyền cho 'string.Format'. – Chev

Trả lời

60

Bạn cần sao chép chữ ký phương thức từ string.format.

public void WriteLine(string text,params object[] args) { 
    this.StringList.Add(string.Format(text,args)); 
} 

Theo đề nghị của ChaosPandion bạn cũng có thể bao gồm quá tải để ngăn chặn việc tạo ra mảng

public void WriteLine(string text) { 
    this.StringList.Add(text); 
} 

public void WriteLine(string text,object arg0) { 
    this.StringList.Add(string.Format(text, arg0)); 
} 

public void WriteLine(string text,object arg0, object arg1) { 
    this.StringList.Add(string.Format(text, arg0, arg1)); 
} 

public void WriteLine(string text,object arg0, object arg1, object arg2) { 
    this.StringList.Add(string.Format(text, arg0, arg1, arg2)); 
} 

Tôi sẽ không đi arg2 qua như string.Format không nên lợi ích sẽ biến mất.

+0

Hoàn hảo! Tôi luôn vui mừng khi tôi dành thời gian để đăng một câu hỏi thích hợp trước khi lãng phí thời gian làm một cái gì đó tẻ nhạt. Có hầu như luôn luôn là một cách tốt hơn. Cảm ơn! – Chev

+2

Tôi sẽ thêm quá tải để tránh tạo mảng cho các trường hợp đơn giản. Có thể lên đến 4 args. – ChaosPandion

+0

@ChaosPandion Đề xuất tốt. Tôi đã lấy lời khuyên của bạn. – Chev

6

Bạn có thể sử dụng params:

public void WriteLine(string text, params object[] parameters) 
{ 
    //.. 
} 
7

Có một trường hợp cạnh bạn có thể muốn chịu khó để tránh. Các mã sau đây sẽ viết chuỗi {0} ra cửa sổ Console

Console.WriteLine("{0}"); 

Tuy nhiên, bạn sử dụng một trong những triển khai của WriteLine gợi ý bởi những người khác trong câu trả lời này, những triển khai sẽ ném một ngoại lệ:

WriteLine("{0}"); //throws exception 

việc sửa chữa đơn giản nhất là một trong hai có hai định nghĩa chồng WriteLine hoặc thay đổi mã gợi ý một chút để xử lý các trường hợp cạnh:

public void WriteLine(string text,params object[] args) { 
    var message=args.Length==0 ? text : string.Format(text, args); 
    this.StringList.Add(message); 
} 
+0

Tôi đã bị quá tải chỉ vì chuỗi đó không phải là vấn đề đối với tôi. Cảm ơn vì đã kêu gọi sự chú ý đến điều đó :) – Chev

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