2017-11-09 18 views
5

그래서 나는 다음과 우연히암시 적 변환이

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

는 어디 ExcelDataField 분명히 나는 ​​내가 쓴 클래스 나 데이터를 읽을 수 있도록합니다 엑셀 시트에서. 나는 이것을 MoveFirst/Next로 VBA DAO 접근과 비슷하게 구현하려고 시도했으며 항상 1 행의 데이터 (currentRow)를 노출했다.

엑셀 시트에서 dynmic 데이터가 나오면 엑셀 시트에서 나오는 데이터를 캡슐화하기 위해 ExcelDataField 클래스를 사용했습니다. 나는에 엑셀 시트를 읽기 위해 사용하고 바로 읽고있다 클래스가이 클래스 ExcelDataField : ExcelDataField<string>의 과부하를 만들어에

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>으로 변경하려고 시도했지만 모두 작동하지 않습니다.

내 이해 보간 된 문자열은 문자열 또는 문자열 만 암시 적으로 변환하지 않는 FormattableString 형식을 사용합니다.

제 질문은 누구나 정확하게 여기에서 무슨 일이 벌어지고 있는지 자세히 설명 할 수 있고 보간 된 문자열을 사용할 수있는 깨끗한 방법이 있습니까?

답변

3

보간 문자열은 내부적 여기 string.Format(...)

을 사용하여 고려 된 옵션의 개요의 래퍼 클래스 FormattableStringstring.Format(...) 표현으로 컴파일 또는 컴파일됩니다 이러한 각 매개 변수 :

  1. IFormatProviderstring.Format(...) 반환에 주어진 않는 ICustomFormatter 물었을 때? 그렇다면 각 값에 대해 먼저 ICustomFormatter.Format을 문의하십시오.
  2. 매개 변수 값의 유형이 IFormattable을 구현합니까? 아니, 다음 .ToString() 방법은 값 귀하의 경우 그래서

에 직접 호출하는 경우 예, 다음 IFormattable.ToString

  • 를 호출하면, 당신의 최선의 선택은 아마도 단지 ToString()를 오버라이드 (override) 할 수 있습니다.

    StringBuilder의 정확한 코드 (적어도 참조 소스에 있음)는 here: StringBuilder.cs, line 1441 - AppendFormatHelper method입니다.

  • 4

    상당히 쉽습니다. $"{currentRow["Projekt"]}"string.Format("{0}", currentRow["Projekt"])과 같습니다. object 인스턴스가 currentRow["Projekt"] 인 경우 ToString 메서드가 호출됩니다. object의 기본 구현은 형식 이름을 반환한다는 것입니다.

    그래서 기본적으로해야 할 일은 해당 동작을 무시하는 것입니다. 당신은 ToString 메소드를 오버라이드하여 해당 작업을 수행 할 수 있습니다

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