2017-11-09 101 views
5

Yani şu tökezlediörtük dönüştürme

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

Nerede ExcelDataField açıkçası ben yazdığım bir sınıf bana veri okumak yardımcı olmak için bir excel sayfasından çıktı. Bunu, MoveFirst/Next ile VBAs DAO erişimine benzemek ve her zaman 1 satırlık veriyi (currentRow) göstermeye çalıştım.

Veriler excel sayfasından çıkarken excel sayfasından çıkan verileri kapsüllemek için bir ExcelDataField sınıfı kullandım. Ben içine bir excel sayfasını okumak için kullanıyorum ve sadece okuyorum sınıftır bu sınıfın ExcelDataField : ExcelDataField<string> bir aşırı yapılmış için

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; 
    } 
} 

Şu anda tüm veriler daha sonra kolayca dize olarak ele alınabilir test amacıyla darlık am konsola geri döndü.

Her şey, örtük dönüştürmeyi bulamadığı enterpolasyonlu dizeleri kullanmadığım sürece iyi çalışır. ExcelDataField : ExcelDataField<string>ExcelDataField : ExcelDataField<String> değiştirmeyi denedim, ancak her ikisi de çalışmıyor.

Anlaşılan dizeler anlamında dizeden veya Dize'den yalnızca dolaylı olarak herhangi bir örtük dönüşüme sahip olmayan FormattableString türünü kullanın.

Sorum şu: Burada tam olarak neler olup bittiğini daha detaylı olarak açıklayabilir ve enterpolasyonlu dizeleri kullanmam için temiz bir yol var mı?

cevap

3

Aralıklı dizeleri isteyeblirim İşte string.Format(...)

kullanır kabul seçenekleri bir özet bir sarıcı sınıfa FormattableString içine string.Format(...) ifadesi içinde derlenmiştir veya derlenmiş olacak her tür parametre için:

  1. IFormatProviderstring.Format(...) dönüş verilen mu bir ICustomFormatter sorulduğunda? Eğer evetse, önce her bir değer için ICustomFormatter.Format'a danışın.
  2. Parametre değeri IFormattable uygulandı mı? hayır, o zaman .ToString() yöntem değeri sizin durumunuzda Yani

doğrudan denir Evet ise, o zaman IFormattable.ToString

  • denir, en iyi seçenek muhtemelen sadece ToString() geçersiz kılmak için.

    Tam kod (en azından başvuru kaynağı içinde) StringBuilder'un içinde bulunur, here: StringBuilder.cs, line 1441 - AppendFormatHelper method bulundu.

  • 4

    Oldukça kolaydır. $"{currentRow["Projekt"]}" sadece string.Format("{0}", currentRow["Projekt"]) ile aynıdır. currentRow["Projekt"] tarafından sağlanan object örneğinde, ToString yöntemi çağrılır. object'daki varsayılan uygulama, tür adını döndürmesidir.

    Temel olarak tek yapmanız gereken bu davranışı geçersiz kılmak. Sen ToString yöntemini geçersiz kılarak bunu yapabilir:

    public override string ToString() 
    { 
        return dataField.Data?.ToString(); 
    } 
    
    İlgili konular