VB.NET: System.Object उदाहरण पर एक्सटेंशन विधि का उपयोग करना असंभव है




extension-methods late-binding (4)

क्या मैं System.Object (सबकुछ) के सभी उप-वर्गों के लिए एक एक्सटेंशन विधि बना सकता हूं?

उदाहरण:

<Extension>
Public Function MyExtension(value As Object) As Object
    Return value
End Function

उपर्युक्त कार्य ऑब्जेक्ट उदाहरण के लिए काम नहीं करेंगे:

Dim myObj1 As New Object()
Dim myObj2 = myObj1.MyExtension()

संकलक इसे स्वीकार नहीं करता है, क्या मेरे कंप्यूटर में समस्या है? :)

अद्यतन करें
समस्या केवल वीबी में होती है, जहां ऑब्जेक्ट के सदस्यों को प्रतिबिंब ( late-bound ) द्वारा देखा जाता है।

उत्तर दिए जाने के बाद अद्यतन करें
एफवाईआई, क्योंकि वीबी का एक फायदा है कि सी # की कमी है, आयातित मॉड्यूल के सदस्य वैश्विक दायरे में आयात किए जाते हैं ताकि आप अभी भी इन कार्यों को उनके रैपर के बिना उपयोग कर सकें:

Dim myObj2 = MyExtension(myObj1)

आप ऑब्जेक्ट के लिए सीधे एक्सटेंशन विधि नहीं लिख सकते हैं, लेकिन जेनरिक का उपयोग करके आप एक ही परिणाम प्राप्त कर सकते हैं:

<Extension()>
Public Function NullSafeToString(Of T)(this As T) As String
    If this is Nothing Then
       Return String.Empty
    End If
    Return this.ToString()
End Function

ध्यान दें कि आप ऑब्जेक्ट टाइप करने के लिए घोषित की गई चीज़ों को छोड़कर सबकुछ पर विस्तार विधि के रूप में इसे कॉल कर सकते हैं। उन लोगों के लिए, आपको या तो इसे सीधे (मूर्ख प्रमाण) या कॉलिंग के माध्यम से कॉल करना होगा (जो असफल हो सकता है, क्योंकि कोई यूनिवर्सल इंटरफ़ेस नहीं है, इसलिए कुछ हद तक चंचलता है)।


ऐसा लगता है कि ऑब्जेक्ट पर विस्तार विधियों का समर्थन नहीं करना वीबी में एक डिजाइन निर्णय था।

नतीजतन, मौजूदा तरीके से मौजूदा कोड को पूरी तरह से तोड़ने से विस्तार विधियों को रोकने का एकमात्र तरीका उन्हें ऑब्जेक्ट के रूप में टाइप किए गए किसी भी चीज़ पर इस्तेमाल करने से रोकना था।

http://blogs.msdn.com/b/vbteam/archive/2007/01/24/extension-methods-and-late-binding-extension-methods-part-4.aspx


यदि आप ऑब्जेक्ट इंटेलिजेंस पर बहुत अधिक एक्सटेंशन करते हैं तो कम उपयोगी हो सकता है, लेकिन यह पूरी तरह से मान्य है।

ऑब्जेक्ट जानकारी के लिए ऑब्जेक्ट पर एक्सटेंशन विधि का उदाहरण यहां दिया गया है:

http://www.developer.com/net/csharp/article.php/3718806/NET-Tip-Using-Extension-Methods.htm


मैंने इस सवाल को कुछ समय पहले पूछा था । असल में, यदि आप चाहें तो VB.NET में Object का विस्तार कर सकते हैं; लेकिन पीछे की संगतता कारणों के लिए, Object रूप में घोषित कोई चर आपके एक्सटेंशन विधि का उपयोग करने में सक्षम नहीं होगा। ऐसा इसलिए है क्योंकि VB.NET Object पर देर से बाध्यकारी का समर्थन करता है, इसलिए किसी Object के प्रकार से उसी नाम की विधि खोजने के प्रयास में विस्तार विधि तक पहुंचने का प्रयास अनदेखा कर दिया जाएगा।

तो इस विस्तार विधि को लें, उदाहरण के लिए:

<Extension()>
Public Sub Dump(ByVal obj As Object)
    Console.WriteLine(obj)
End Sub

इस विस्तार विधि का उपयोग यहां किया जा सकता है:

' Note: here we are calling the Dump extension method on a variable '
' typed as String, which works because String (like all classes) '
' inherits from Object. '
Dim str As String = "Hello!"
str.Dump()

लेकिन यहाँ नहीं:

' Here we attempt to call Dump on a variable typed as Object; but '
' this will not work since late binding is a feature that came before '
' extension methods. '
Dim obj As New Object
obj.Dump()

खुद से पूछें कि सी # में dynamic चर पर विस्तार विधियां क्यों काम नहीं करती हैं, और आपको पता चलेगा कि स्पष्टीकरण वही है।







late-binding