2009-11-04 12 views
12

यह सुनिश्चित नहीं है कि मैं यहां क्या कर रहा हूं। विस्तार विधि पहचाना नहीं गया है।स्ट्रिंग क्लास में एक एक्सटेंशन विधि जोड़ना - सी #

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; 
     } 
    } 
} 

उत्तर

31

आप प्रकार स्ट्रिंग पर कॉल करने के लिए कोशिश कर रहे हैं। आपको इसे स्ट्रिंग इंस्टेंस पर कॉल करने की आवश्यकता है, उदा।

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

बेशक है कि आप क्या, के लिए यह चाहते हैं, क्योंकि SafeFormat विधि वास्तव में पूरी तरह से पहले पैरामीटर (s) वैसे भी अनदेखी है काम नहीं चलेगा। यह इस तरह दिखना चाहिए:

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; 
    } 

तो फिर तुम फोन कर सकते हैं:

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

विस्तार के तरीकों की बात यह है कि वे उदाहरण की तरह विस्तारित प्रकार पर तरीकों देखो है। आप विस्तृत विधियों पर स्थिर विधियों के रूप में दिखाई देने वाली एक्सटेंशन विधियां नहीं बना सकते हैं।

2

कोशिश

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

शानदार। आश्चर्य है कि यह स्ट्रिंग के लिए ऐसा क्यों नहीं कर रहा था। SfeFormat()? –

+0

इसमें स्ट्रिंग का संदर्भ नहीं है। –

+0

@Chris: क्योंकि स्ट्रिंग प्रकार का नाम है, प्रकार का उदाहरण नहीं। ध्यान दें कि यह उदाहरण वास्तव में काम नहीं करेगा, क्योंकि SafeFormat विधि को दो स्ट्रिंग तर्कों के साथ-साथ पैरामीटर की आवश्यकता होती है। –

10

आप एक उदाहरण विस्तार विधि को परिभाषित करने, और फिर एक स्थिर पद्धति के रूप में इसका इस्तेमाल करने की कोशिश कर रहे हैं। (सी # हालांकि एफ # उस बात के लिए, एक स्थिर विस्तार विधि को परिभाषित करने में सक्षम नहीं है।)

के बजाय:

result = "Hello".SafeFormat(); 

यानी आप कर रहे हैं:

result = string.SafeFormat("Hello"); 

आप की तरह कुछ चाहता हूँ स्ट्रिंग इंस्टेंस पर ऑपरेटिंग (इस मामले में "हैलो")।

3

एक्सटेंशन विधियां एक प्रकार के उदाहरणों पर दिखाई देती हैं, न कि प्रकार (जैसे स्थैतिक सदस्य)।