隐式转换为string/string内部插入的string
所以我偶然发现了以下几点:
Console.WriteLine(currentRow["Projekt"]); Console.WriteLine($"{currentRow["Projekt"]}"); Console.WriteLine($"{(string)currentRow["Projekt"]}");
输出:
> Data that i want > Namespace.ExcelDataField > Data that i want
在ExcelDataField中,我明显是我写的一个类来帮助我从Excel工作表中读取数据。 我尝试使用MoveFirst / Next类似于VBAs DAO访问,并始终公开1行数据(currentRow)。
我使用ExcelDataField类来封装Excel数据表中的数据,因为数据是从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; } }
目前我为testing目的asuming所有数据可以稍后轻松地处理为一个string,我做了这个类ExcelDataField : ExcelDataField<string>
的重载ExcelDataField : ExcelDataField<string>
这是我正在使用的类读取Excel表单,只是读它回来控制台。
一切正常,只要我不使用内插string,显然没有find我的隐式转换。 我试图将ExcelDataField : ExcelDataField<string
>更改为ExcelDataField : ExcelDataField<String>
但都不起作用。
在我的理解内插string使用的FormattableStringtypes没有任何从string或string只有显式的隐式转换。
我的问题是任何人都可以更详细地解释这里究竟发生了什么,有没有一种干净的方式可以使用插值string?
插值string将被编译为一个string.Format(...)
expression式,或编译成一个包装类FormattableString在内部使用string.Format(...)
以下是每个参数所考虑选项的简要说明:
-
IFormatProvider
给string.Format(...)
的时候是否返回一个ICustomFormatter
? 如果是,那么请先为每个值查阅ICustomFormatter.Format
。 - 参数值的types是否实现
IFormattable
? 如果是,则调用IFormattable.ToString - 如果不是,则直接在该值上调用
.ToString()
方法
所以在你的情况下,你最好的select可能只是覆盖ToString()
。
确切的代码(至less在参考源)是在StringBuilder
,在这里find:StringBuilder.cs,行1441 – AppendFormatHelper方法 。
这相当简单。 $"{currentRow["Projekt"]}"
与string.Format("{0}", currentRow["Projekt"])
。 在由currentRow["Projekt"]
提供的object
实例上,调用ToString
方法。 object
的默认实现是返回types名称。
所以基本上你所要做的就是重写这个行为。 你可以通过覆盖ToString
方法来做到这一点:
public override string ToString() { return dataField.Data?.ToString(); }