2009-11-04 41 views
12

Không chắc chắn tôi đang làm gì sai ở đây. Phương thức mở rộng không được nhận dạng.Thêm phương thức mở rộng vào lớp chuỗi - C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 
using StringExtensions; 


namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      RunTests(); 
     } 

     static void RunTests() 
     { 
      try 
      { 
       ///SafeFormat 
       SafeFormat("Hi There"); 

       SafeFormat("test {0}", "value"); 

       SafeFormat("test missing second value {0} - {1}", "test1"); 

       SafeFormat("{0}"); 

       //regular format 
       RegularFormat("Hi There"); 

       RegularFormat("test {0}", "value"); 

       RegularFormat("test missing second value {0} - {1}", "test1"); 

       RegularFormat("{0}"); 

       ///Fails to recognize the extension method here 
       string.SafeFormat("Hello"); 

      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
      } 
      Console.ReadLine(); 
     } 

     private static void RegularFormat(string fmt, params object[] args) 
     { 
      Console.WriteLine(String.Format(fmt, args)); 
     } 

     private static void SafeFormat(string fmt, params object[] args) 
     { 
      string errorString = fmt; 

      try 
      { 
       errorString = String.Format(fmt, args); 
      } 
      catch (System.FormatException) { } //logging string arguments were not correct 
      Console.WriteLine(errorString); 
     } 

    } 

} 

namespace StringExtensions 
{ 
    public static class StringExtensionsClass 
    { 
     public static string SafeFormat(this string s, string fmt, params object[] args) 
     { 
      string formattedString = fmt; 

      try 
      { 
       formattedString = String.Format(fmt, args); 
      } 
      catch (System.FormatException) { } //logging string arguments were not correct 
      return formattedString; 
     } 
    } 
} 

Trả lời

31

Bạn đang cố gắng gọi nó trên loại chuỗi. Bạn cần phải gọi nó trên một chuỗi dụ, ví dụ:

"{0}".SafeFormat("Hello"); 

Phải thừa nhận rằng điều đó sẽ không làm những gì bạn muốn nó, bởi vì phương pháp SafeFormat là thực sự hoàn toàn bỏ qua các tham số đầu tiên (s) anyway. Nó sẽ giống như thế này:

public static string SafeFormat(this string fmt, params object[] args) 
    { 
     string formattedString = fmt; 

     try 
     { 
      formattedString = String.Format(fmt, args); 
     } 
     catch (FormatException) {} //logging string arguments were not correct 
     return formattedString; 
    } 

Sau đó, bạn có thể gọi:

"{0} {1}".SafeFormat("Hi", "there"); 

Mấu chốt của phương pháp khuyến nông là họ trông giống như dụ phương pháp vào loại mở rộng. Bạn không thể tạo các phương thức mở rộng có vẻ là phương thức tĩnh tĩnh trên loại mở rộng.

2

thử

"Hello".SafeFormat("{0} {1}", "two", "words") 
+0

Rực rỡ. Tự hỏi tại sao nó không làm điều đó cho string.SafeFormat()? –

+0

Nó không có tham chiếu đến một chuỗi. –

+0

@Chris: Bởi vì chuỗi là tên của loại, không phải là một thể hiện của loại. Lưu ý rằng ví dụ này sẽ không thực sự hoạt động, bởi vì phương thức SafeFormat yêu cầu hai đối số chuỗi cũng như các tham số. –

10

Bạn đang xác định phương thức mở rộng dụ và sau đó cố gắng sử dụng phương thức này làm phương thức tĩnh. (C# là không có khả năng xác định một phương pháp khuyến nông tĩnh, mặc dù F # là cho rằng vấn đề.)

Thay vì:

result = string.SafeFormat("Hello"); 

bạn muốn một cái gì đó như:

result = "Hello".SafeFormat(); 

tức là Bạn hoạt động trên thể hiện chuỗi ("Hello" trong trường hợp này).

3

Phương thức mở rộng xuất hiện trên các phiên bản của một loại, chứ không phải chính loại đó (ví dụ: các thành viên tĩnh).

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