2011-01-22 21 views
10

मुझे पता है कि आप एक वस्तु के ToString() विधि को रद्द कर सकते हैं, ताकि हर आप एक वस्तु पर कॉल करें या इसे एक समारोह है कि एक स्ट्रिंग टाइप यह एक स्ट्रिंग में परिवर्तित हो जाएगा की आवश्यकता के लिए गुजरती हैं।सी # में स्वत: प्रकार रूपांतरण

मैं ऑब्जेक्ट प्रकार 'वस्तु'

public static DateTime ToDate(this object date) 
{ 
    return DateTime.Parse(date.ToString()); 
} 

public static int ToInteger(this object num) 
{ 
    return Int32.Parse(num.ToString()); 
} 

public static long ToLong(this object num) 
{ 
    return Int64.Parse(num.ToString()); 
} 

ताकि मैं सिर्फ उन्हें इस तरह कह सकते हैं के लिए कई विस्तार के तरीकों में लिखा है:

eventObject.Cost = row["cost"].ToString(); 
eventObject.EventId = row["event_id"].ToLong(); 

हालांकि, मैं क्या करना चाहते कन्वर्ट करने के लिए कर रहा है पंक्ति वस्तुएं जो 'ऑब्जेक्ट' प्रकार का है, अपने 'eventObject' पर संपत्ति प्रकारों के आधार पर अपने सही प्रकार के लिए। तो, मैं इसे इस तरह कह सकता हूं:

eventObject.Cost = row["cost"]; 
eventObject.EventId = row["event_id"]; 

पंक्ति महत्वपूर्ण है यदि यह महत्वपूर्ण है।

+6

आप कनवर्ट क्लास का उपयोग क्यों नहीं कर रहे हैं? http://msdn.microsoft.com/en-us/library/system.convert.aspx - और नहीं, आप अपने अंतिम कोड की तरह चुप प्रकार रूपांतरण नहीं प्राप्त कर सकते हैं, जब तक कि आप "पंक्ति [x]" को वापस नहीं करते कस्टम ऑब्जेक्ट जो जानता है कि निहित कास्टिंग कैसे करें। –

+0

+1 @Lasse कनवर्ट क्लास का उपयोग करना उपयोगिता विधियों के साथ 'ऑब्जेक्ट' को स्पैक्स करना बेहतर है। –

+0

अब उपयोग करेगा, सोचा था कि इसमें कोई फर्क नहीं पड़ता –

उत्तर

24

सी # प्रकार के लिए implicit रूपांतरण का समर्थन करता है और आपको निम्न की तरह अपने कस्टम प्रकार के लिए उपयोग कर सकते हैं: निम्नलिखित की तरह एक विस्तार पद्धति के रूप में

class CustomValue 
{ 
    public static implicit operator int(CustomValue v) { return 4; } 

    public static implicit operator float(CustomValue v) { return 4.6f; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     int x = new CustomValue(); // implicit conversion 
     float xx = new CustomValue(); // implicit conversion 
    } 
} 

और extension methods का समर्थन करता है, लेकिन नहीं है निहित रूपांतरण समर्थन :

static class MyExtension 
{ 
    // Not supported 
    public static implicit operator bool(this CustomValue v) 
    { 
     return false; 
    } 
} 
+0

क्या मैं System.Data.DataRow के लिए निहित ऑपरेटरों को जोड़ सकता हूं? –

+0

नहीं, आप इसलिए नहीं कर सकते क्योंकि यह केवल उपयोगकर्ता परिभाषित प्रकार उपलब्ध है। – Homam

+0

आप इसे जोड़ सकते हैं 'ToCustomValue' एक्सटेंशन विधि – CodesInChaos

0

मेरा मानना ​​है कि क्या आप देख रहे हैं निहित रूपांतरण है, जो यहाँ वर्णित है: http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx

हालांकि, वस्तु के लिए इन जोड़ने के लिए एक बहुत बुरा विचार, पेज मैं से लिंक किया है पर उल्लिखित कारणों के लिए किया जाएगा।

1

मुझे पता है कि आप एक वस्तु की ToString (रद्द कर सकते थे) Meth आयुध डिपो, ताकि हर आप एक वस्तु पर कॉल करें या यह एक समारोह है कि एक स्ट्रिंग प्रकार यह एक स्ट्रिंग में परिवर्तित हो जाएगा की आवश्यकता के लिए गुजरती हैं।

नहीं, आप गलत हैं। निम्नलिखित कोड संकलन नहीं:

class MyClass 
{ 
    public override string ToString() 
    { 
     return "MyClass"; 
    } 
} 

static void MyMethod(string s) { } 

static void Main(string[] args) 
{ 
    MyMethod(new MyClass()); //compile error 
} 

संकलक MyMethod पैरामीटर (जो string है) के प्रकार के नहीं मिलेगा पहला और इसे करने के लिए तर्क आप पारित कर दिया (जिसका प्रकार MyClass है) कन्वर्ट करने के लिए प्रयास करें। मुझे लगता है कि आप शायद Console.WriteLine जैसी किसी चीज़ से गुमराह हो। कोड के आधार पर ऊपर, Console.WriteLine(new MyClass()) प्रिंट "MyClass" कंसोल के लिए, यह लगता है कि संकलक जानता आप Console.WriteLine के लिए एक स्ट्रिंग गुजरती हैं और स्ट्रिंग के लिए MyClass परिवर्तित करने के लिए प्रयास करना चाहिए। लेकिन आवश्यक Console.WriteLine कई भार के है, उनमें से एक object के लिए है:

//from Console.cs 
public static void WriteLine(object value) 
{ 
    //in this method there is something like 
    //Console.WriteLine(value.ToString()); 
} 
0

मुझे माफ कर दो अगर मैं स्पष्ट करते हुए कहा रहा हूँ, लेकिन मैं अपने प्रश्न को पढ़ने के बाद यह धारणा मिला है।

आप .NET में हर प्रकार की basetype पता सही आपत्ति है? तो टाइप ऑब्जेक्ट का वर्णन करने वाले डाटरो में कॉलम भी उसी सदस्य के रूप में हो सकता है, जिस सदस्य को आप असाइन करने का प्रयास कर रहे हैं और फिर एक साधारण कलाकार की आवश्यकता है।

उदाहरण के लिए

eventObject.EventId = (int) पंक्ति [ "event_id"];

0

समेकित करने के लिए - बस इन विधियों को परिभाषित करें और आप पैरामीटर के रूप में स्ट्रिंग की आवश्यकता वाले विधियों में कक्षा परीक्षण की वस्तुओं का उपयोग कर सकते हैं।

class Test 
{ 
    private String txt; 

    public static implicit operator string(Test t) 
    { 
     return t.ToString(); 
    } 

    public override string ToString() 
    { 
     return txt; 
    } 
} 
संबंधित मुद्दे