2011-02-13 11 views
37

मैंने यह कोशिश की है:ToString के लिए एक एक्सटेंशन विधि कैसे बनाएं?

public static class ListHelper 
{ 
    public static string ToString<T>(this IList<String> list) 
    { 
     return string.Join(", ", list.ToArray()); 
    } 

    public static string ToString<T>(this String[] array) 
    { 
     return string.Join(", ", array); 
    } 
} 

लेकिन यह string[] और List<string> दोनों के लिए काम नहीं करता है। शायद मुझे कुछ विशेष टिप्पणियों की ज़रूरत है?

उत्तर

86

एक्सटेंशन तरीकों केवल जाँच कर रहे हैं। ToString() पर कॉल के मामले में हमेशा पर ToString() पर लागू उम्मीदवार विधि हो।विस्तार के तरीकों के प्रयोजन के विस्तार एक प्रकार पर उपलब्ध तरीकों का सेट, ओवरराइड मौजूदा तरीकों के लिए नहीं है, यही कारण है कि उन्हें "विस्तार विधियां" कहा जाता है। यदि आप किसी मौजूदा विधि को ओवरराइड करना चाहते हैं तो आपको ओवरराइडिंग विधि बनाना होगा।

+1

+1। एमएसडीएन का संदर्भ: http://msdn.microsoft.com/en-us/library/bb383977.aspx (उदाहरण अनुभाग देखें) – madhurtanwani

3

, बस आप नाम ToString उपयोग नहीं करना चाहिए एक्सटेंशन विधि के लिए के रूप में यह क्योंकि उस पद्धति पहले से ही मौजूद हैं और तुम वहाँ अपने बेकार के रूप में T उपयोग नहीं करना चाहिए कभी नहीं बुलाया जाएगा।

उदाहरण मैं इस कोशिश की और के लिए इसे फिर से एक ही बात लौटे:

Console.WriteLine(lst.ToString<int>()); 

उत्पादन:

shekhar, shekhar, shekhar, shekhar 

इसलिए इस समय मैं int इस्तेमाल किया और यह अभी भी भाग गया क्योंकि कि टी तो कोई अन्य उपयोग है विधि प्रोटोटाइप बदल रहा है।

तो बस तुम क्यों ToString विधि नाम के रूप में शाब्दिक उपयोग कर रहे हैं, के रूप में यह पहले से ही मौजूद है और आप एक एक्सटेंशन विधि में ओवरराइड नहीं कर सकते, इस कारण से आपको लगता है कि T यह सामान्य बनाने के लिए उपयोग करने के लिए था। कुछ अलग नाम की तरह

public static string ToMyString(this IList<String> list) 

इस तरह आप के रूप में यह बेकार वहाँ सामान्य उपयोग करने के लिए नहीं होगा का उपयोग करें और आप बस इसे हमेशा की तरह कह सकते हैं।


यह कहा गया कि आपका कोड मेरे लिए काम कर रहा है। यहाँ है क्या मैं (LINQPad में ) की कोशिश की:

void Main() 
{ 

    List<string> lst = new List<string>(); 
    lst.Add("shekhar"); 
    lst.Add("shekhar"); 
    lst.Add("shekhar"); 
    lst.Add("shekhar"); 
    lst.ToString<string>().Dump(); 
} 

    public static class ListHelper 
    { 
     public static string ToString<T>(this IList<String> list) 
     { 
      return string.Join(", ", list.ToArray()); 
     } 

     public static string ToString<T>(this String[] array) 
     { 
      return string.Join(", ", array); 
     } 
    } 

और जब बुला उत्पादन shekhar, shekhar, shekhar, shekhar

जब से तुम उल्लेख किया है कि TToString<T> में आप string की तरह एक प्रकार का उल्लेख करने की आवश्यकता होगी या int था ToString विधि।

+0

हालांकि जब मैं files.ToString () फोन यह काम :) फ़ाइलों की तुलना में अपने लंबे समय तक अभी भी इसे पसंद करता है, लेकिन मैं :) – IAdapter

+0

के रूप में मैं शुरू में कहा मैं LINQPad में इस संहिता भाग गया हम देखते है डंप() करने के लिए विधि देखना क्या एक वस्तु के अंदर .. सामान्य सी # कार्यक्रम में सिर्फ फोन 'Console.WriteLine (lst.ToString ());' –

+1

आप टी के रूप में कुछ भी दे सकते हैं और यह काम करेंगे। विधि में सामान्य प्रकार का उपयोग नहीं करते हैं। files.ToString (), files.ToString (), वर str = list.ToString <शब्दकोश >(), आदि –

5

ऐसा लगता है कि आप files.ToString() रिटर्न को प्रतिस्थापित करना चाहते हैं। आप ऐसा करने files के रूप में आवंटित करने के लिए एक कस्टम वर्ग लेखन के बिना सक्षम है, आप इसे उपयोग नहीं कर रहे नहीं होगा (अर्थात सूची से विरासत और ToString() ओवरराइड।)

सबसे पहले, सामान्य प्रकार (<T>) से छुटकारा पाने के। इसके बाद, आपको एक्सटेंशन विधि का नाम बदलने की आवश्यकता होगी क्योंकि files.ToString() पर कॉल करने से केवल सूची की ToString विधि को कॉल किया जाएगा।

यह वही करता है जो आप खोज रहे हैं। अगर वहाँ लागू नहीं उम्मीदवार तरीकों से मेल खाने वाले हैं

static class Program 
{ 
    static void Main() 
    { 
     var list = new List<string> { {"a"}, {"b"}, {"c"} }; 
     string str = list.ToStringExtended(); 
    } 
} 


public static class ListHelper 
{ 
    public static string ToStringExtended(this IList<String> list) 
    { 
     return string.Join(", ", list.ToArray()); 
    } 
} 
संबंधित मुद्दे