2008-08-07 13 views
14

सी # नेट में प्रोटोटाइप विधियों को कैसे बनाना संभव है?मैं सी # नेट में प्रोटोटाइप तरीके (जावास्क्रिप्ट की तरह) कैसे बना सकता हूं?

String.prototype.trim = function() { 
    return this.replace(/^\s+|\s+$/g,""); 
} 

मैं सी # नेट में ऐसा करने के बारे में जाना कैसे कर सकते हैं:

जावास्क्रिप्ट में, मैं स्ट्रिंग वस्तु के लिए एक ट्रिम विधि बनाने के लिए निम्नलिखित कर सकते हैं?

उत्तर

20

कॉल कर सकते हैं आप गतिशील रूप से, .NET में मौजूदा वस्तुओं या वर्गों के लिए तरीके जोड़ नहीं कर सकता कि वर्ग के लिए स्रोत बदलकर को छोड़कर।

हालांकि, आप सी # 3.0 में विस्तार विधियों का उपयोग कर सकते हैं, जो नए तरीकों की तरह दिखते हैं, लेकिन संकलित समय जादू हैं।

अपने कोड के लिए ऐसा करने के लिए:

public static class StringExtensions 
{ 
    public static String trim(this String s) 
    { 
     return s.Trim(); 
    } 
} 

इसका इस्तेमाल करने के लिए:

String s = " Test "; 
s = s.trim(); 

यह एक नई विधि की तरह लग रहा है, लेकिन इस कोड के रूप में ठीक उसी तरह से संकलित कर देगा:

String s = " Test "; 
s = StringExtensions.trim(s); 

आप वास्तव में क्या करने की कोशिश कर रहे हैं? शायद आप जो चाहते हैं उसे करने के बेहतर तरीके हैं?

+0

धन्यवाद Lassevk, महान उत्तर :) "आप वास्तव में क्या करने की कोशिश कर रहे हैं?" के जवाब में। हर बार, मुझे एक स्ट्रिंग या अन्य ऑब्जेक्ट में हेरफेर करने की आवश्यकता है। ऐसा करने के लिए एक समारोह को कॉल करने के बजाय, मैंने सोचा था कि इसे एक विधि के रूप में कॉल करना बेहतर होगा। मैं वर्तमान में Asp.net में वेब अनुप्रयोगों को लिख रहा हूं और मुझे अभी तक Asp.net 3.x नहीं लगता है, इसलिए मुझे अभी प्रतीक्षा करनी होगी। लेकिन आपके उत्तर के लिए धन्यवाद। – GateKiller

0

आपको एक एक्सटेंशन विधि बनाने की आवश्यकता है, जिसके लिए .NET 3.5 की आवश्यकता है। एक स्थिर वर्ग में, विधि स्थिर होना चाहिए। विधि के पहले पैरामीटर को हस्ताक्षर में "इस" के साथ उपसर्ग करने की आवश्यकता है।

public static string MyMethod(this string input) 
{ 
    // do things 
} 

फिर आप इसे पसंद

"asdfas".MyMethod(); 
0

3.5 संकलक का उपयोग करके आप एक एक्सटेंशन विधि का उपयोग कर सकते हैं:

public static void Trim(this string s) 
{ 
    // implementation 
} 

आप इस हैक शामिल करके एक CLR 2.0 लक्षित परियोजना (3.5 संकलक) पर इस का उपयोग कर सकते हैं:

namespace System.Runtime.CompilerServices 
{ 
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)] 
    public sealed class ExtensionAttribute : Attribute 
    { 
    } 
} 
4

ऐसा लगता है जैसे आप सी # के एक्सटेंशन तरीके के बारे में बात कर रहे हैं। आप पहले पैरामीटर से पहले "यह" कीवर्ड डालने से मौजूदा कक्षाओं में कार्यक्षमता जोड़ते हैं। विधि को स्थिर वर्ग में एक स्थिर विधि होना चाहिए। .NET में स्ट्रिंग्स में पहले से ही "ट्रिम" विधि है, इसलिए मैं एक और उदाहरण का उपयोग करूंगा।

if ("Why hello there, Mabster!".ContainsMabster()) { /* ... */ } 

ध्यान दें कि आप भी इंटरफेस (जैसे IList) के विस्तार के तरीकों में जोड़ सकते हैं, जो इसका मतलब है कि:

public static class MyStringEtensions 
{ 
    public static bool ContainsMabster(this string s) 
    { 
     return s.Contains("Mabster"); 
    } 
} 

तो अब हर स्ट्रिंग एक काफी उपयोगी ContainsMabster विधि है, जो मैं इस तरह उपयोग कर सकते हैं इंटरफ़ेस को लागू करने वाली कोई भी कक्षा उस नई विधि को भी उठाएगी।

विस्तार विधि में आपके द्वारा घोषित किए गए किसी भी अतिरिक्त पैरामीटर (पहले "इस" पैरामीटर के बाद) को सामान्य पैरामीटर के रूप में माना जाता है।

संबंधित मुद्दे

 संबंधित मुद्दे