2017-11-09 34 views
5

तो मैं निम्नलिखित पर ठोकर खाईअंतर्निहित रूपांतरण

> Data that i want 
> Namespace.ExcelDataField 
> Data that i want 

कहाँ ExcelDataField मैं स्पष्ट रूप से एक वर्ग मैंने लिखा मुझे डेटा को पढ़ने में मदद करने के एक एक्सेल शीट से बाहर। मैंने इसे MoveFirst/Next के साथ वीबीए डीएओ एक्सेस के समान बनाने के लिए इसे लागू करने की कोशिश की और हमेशा डेटा की एक पंक्ति (currentRow) का पर्दाफाश किया।

मैंने अपने एक्सेल शीट से बाहर आने वाले डेटा को समाहित करने के लिए एक्सेलडाटाफिल्ड क्लास का उपयोग किया क्योंकि डेटा एक्सेल शीट से बाहर निकलने वाला है।

public class ExcelDataField<T> 
{ 
    private Excel.Range m_XlRange; 
    private int m_Row; 
    private int m_Col; 

    public T Data 
    { 
     get 
     { 
      return (T)(this.m_XlRange.Cells[this.m_Row, this.m_Col] as Excel.Range)?.Value2; 
     } 

     set 
     { 
      this.m_XlRange.Cells[this.m_Row, this.m_Col] = value; 
     } 
    } 

    public ExcelDataField(Excel.Range range, int row, int col) 
    { 
     this.m_XlRange = range; 
     this.m_Row = row; 
     this.m_Col = col; 
    } 

    public static implicit operator T(ExcelDataField<T> dataField) 
    { 
     return dataField.Data; 
    } 
} 

वर्तमान में मैं परीक्षण प्रयोजनों कि सभी डेटा बाद में आसानी से एक स्ट्रिंग के रूप में संभाला जा सकता है के लिए asuming हूँ करने के लिए मैं इस वर्ग ExcelDataField : ExcelDataField<string> जो वर्ग मैं में एक एक्सेल शीट को पढ़ने के लिए उपयोग कर रहा हूँ और सिर्फ पढ़ने है की एक अधिभार बनाया यह वापस कंसोल के लिए।

सब कुछ ठीक काम करता है जब तक कि मैं इंटरपोलेटेड तारों का उपयोग नहीं कर रहा हूं जो स्पष्ट रूप से मेरे निहित रूपांतरण को नहीं ढूंढते हैं। मैंने ExcelDataField : ExcelDataField<string>ExcelDataField : ExcelDataField<String> को बदलने की कोशिश की लेकिन दोनों काम नहीं करते हैं।

मेरी समझ में इंटरपोलेटेड स्ट्रिंग्स स्वरूपणस्ट्रिंग प्रकार का उपयोग करती हैं जिसमें स्ट्रिंग या स्ट्रिंग से केवल स्पष्ट रूप से कोई स्पष्ट रूपांतरण नहीं होता है।

मेरा प्रश्न कोई भी विस्तार से समझा सकता है कि वास्तव में क्या हो रहा है और क्या मेरे लिए इंटरपोलेटेड स्ट्रिंग का उपयोग करने में सक्षम तरीका है?

उत्तर

3

अंतर्वेशित तार या तो एक string.Format(...) अभिव्यक्ति में संकलित किया जाएगा, या संकलित एक आवरण वर्ग FormattableString कि आंतरिक रूप से string.Format(...)

का उपयोग करता है यहाँ माना विकल्प की एक प्रक्रिया इस प्रकार हैः में ऐसे प्रत्येक पैरामीटर के लिए:

  1. IFormatProviderstring.Format(...) वापसी के लिए दिया है एक ICustomFormatter जब उनसे पूछा गया? यदि हां तो पहले प्रत्येक मान के लिए ICustomFormatter.Format से परामर्श लें।
  2. क्या पैरामीटर मान का प्रकार IFormattable लागू करता है? हाँ, तो IFormattable.ToString
  3. कहा जाता है यदि नहीं, तो .ToString() विधि सीधे मूल्य
अपने मामले में

तो पर कहा जाता है, आपका सबसे अच्छा विकल्प शायद सिर्फ ToString() ओवरराइड करने के लिए।

सटीक कोड (कम से कम संदर्भ स्रोत में) StringBuilder के अंदर है, here: StringBuilder.cs, line 1441 - AppendFormatHelper method मिला।

4

यह काफी आसान है। $"{currentRow["Projekt"]}"string.Format("{0}", currentRow["Projekt"]) जैसा ही है। पर currentRow["Projekt"] द्वारा प्रदान किया गया उदाहरण, ToString विधि कहा जाता है। object पर डिफ़ॉल्ट कार्यान्वयन यह है कि यह प्रकार का नाम देता है।

तो मूल रूप से आपको केवल उस व्यवहार को ओवरराइड करना है। आप ऐसा कर सकते हैं ToString विधि अधिभावी द्वारा:

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