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

सी # नेट में प्रोटोटाइप तरीकों को कैसे बनाना संभव है?

जावास्क्रिप्ट में, मैं स्ट्रिंग ऑब्जेक्ट के लिए ट्रिम विधि बनाने के लिए निम्न कार्य कर सकता हूं:

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

मैं इसे सी # नेट में करने के बारे में कैसे जा सकता हूं?

0
ro fr bn

4 उत्तर

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

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

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

namespace System.Runtime.CompilerServices
{
  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
  public sealed class ExtensionAttribute : Attribute
  {
  }
}
0
जोड़ा

आप उस वर्ग के स्रोत को बदलकर, .NET में मौजूदा ऑब्जेक्ट्स या कक्षाओं में गतिशील रूप से विधियां नहीं जोड़ सकते हैं।

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

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

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, स्रोत

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

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

तो अब हर स्ट्रिंग में जबरदस्त उपयोगी सामग्री है मैबस्टर विधि, जिसे मैं इस तरह उपयोग कर सकता हूं:

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

ध्यान दें कि आप इंटरफ़ेस (उदाहरण के लिए IList) में एक्सटेंशन विधियां भी जोड़ सकते हैं, जिसका अर्थ है कि उस इंटरफ़ेस को लागू करने वाली कोई भी कक्षा उस नई विधि को भी उठाएगी।

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

0
जोड़ा

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

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

फिर आप इसे पसंद कर सकते हैं

"asdfas".MyMethod();
0
जोड़ा