2017-11-09 36 views
5

Vì vậy, tôi stumbled khi điều sau đây:chuyển đổi ngầm để String/chuỗi bên trong chuỗi suy

Console.WriteLine(currentRow["Projekt"]); 
Console.WriteLine($"{currentRow["Projekt"]}"); 
Console.WriteLine($"{(string)currentRow["Projekt"]}"); 

Với kết quả:

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

đâu ExcelDataField tôi rõ ràng là một lớp học tôi đã viết để giúp tôi đọc dữ liệu ra khỏi một bảng excel. Tôi đã cố gắng để thực hiện điều này giống như truy cập VBA DAO với MoveFirst/Next và luôn luôn phơi bày 1 hàng dữ liệu (currentRow).

Tôi đã sử dụng lớp ExcelDataField để đóng gói dữ liệu sắp ra khỏi bảng tính excel của mình khi dữ liệu xuất hiện dưới dạng dynmic ra khỏi bảng excel.

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

Hiện nay tôi đang asuming cho mục đích thử nghiệm rằng tất cả các dữ liệu sau này có thể dễ dàng được xử lý như một chuỗi để tôi đưa ra một tình trạng quá tải của lớp này ExcelDataField : ExcelDataField<string> đó là lớp tôi đang sử dụng để đọc một tờ excel vào và chỉ cần đọc nó trở lại giao diện điều khiển.

Mọi thứ hoạt động tốt miễn là tôi không sử dụng các chuỗi nội suy rõ ràng là không tìm thấy chuyển đổi tiềm ẩn của tôi. Tôi đã cố gắng thay đổi ExcelDataField : ExcelDataField<string> thành ExcelDataField : ExcelDataField<String> nhưng cả hai đều không hoạt động.

Trong chuỗi sự hiểu biết nội suy của tôi, sử dụng loại FormattableString không có bất kỳ chuyển đổi ngầm nào từ chuỗi hoặc Chuỗi chỉ rõ ràng.

Câu hỏi của tôi có thể giải thích chi tiết hơn về chính xác những gì đang diễn ra ở đây và có cách nào giúp tôi có thể sử dụng các chuỗi nội suy không?

Trả lời

3

chuỗi suy hoặc sẽ được biên dịch thành một biểu string.Format(...), hoặc biên dịch vào một lớp wrapper FormattableString rằng trong nội bộ sử dụng string.Format(...)

Dưới đây là tóm tắt các tùy chọn xem cho mỗi thông số như vậy:

  1. Có phải IFormatProvider được cấp cho trả lại ICustomFormatter khi được hỏi? Nếu có thì hãy tham khảo ICustomFormatter.Format cho mỗi giá trị trước.
  2. Loại giá trị tham số có thực hiện IFormattable không? Nếu có, thì được gọi là IFormattable.ToString
  3. Nếu không, sau đó phương pháp .ToString() được gọi trực tiếp trên giá trị

Vì vậy, trong trường hợp của bạn, lựa chọn tốt nhất của bạn có lẽ là để chỉ ghi đè ToString().

Mã chính xác (ít nhất là trong nguồn tham chiếu) nằm bên trong StringBuilder, được tìm thấy here: StringBuilder.cs, line 1441 - AppendFormatHelper method.

4

Điều này khá dễ dàng. $"{currentRow["Projekt"]}" chỉ giống như string.Format("{0}", currentRow["Projekt"]). Trên phiên bản object được cung cấp bởi currentRow["Projekt"], phương thức ToString được gọi. Việc triển khai mặc định trên object là nó sẽ trả về tên kiểu.

Vì vậy, về cơ bản tất cả những gì bạn phải làm là ghi đè hành vi đó. Bạn có thể làm điều đó bằng cách ghi đè các ToString phương pháp:

public override string ToString() 
{ 
    return dataField.Data?.ToString(); 
} 
Các vấn đề liên quan