将DataRow转换为强类型DataRow:他们是如何做到的

本文关键字:DataRow 何做 他们是 转换 强类型 | 更新日期: 2023-09-27 18:16:16

我正在尝试制作一些强类型datarow的轻量级版本,以便为采用IEnumerable<T> where T : DataRow的方法编写测试。

我想做一个类,从DataRow继承,但有额外的属性,如在自动生成的强类型DataSet.Designer.cs。我不能让他们的代码工作,事实上,我不明白它如何能工作:

// from AnimalDataSet.Designer.cs:
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
public AnimalRow AddAnimalRow(
        string Name, 
        int Species_ID) {
    AnimalRow rowAnimalRow = ((AnimalRow)(this.NewRow()));
    object[] columnValuesArray = new object[] {
        null,
        Name,
        Species_ID};
    rowAnimalRow.ItemArray = columnValuesArray;
    this.Rows.Add(rowAnimalRow);
    return rowAnimalRow;
}

每次我试图运行这个模仿-我得到InvalidCastException(无法转换系统类型的对象)。DataRow转换为AnimalRow类型)。如我所料。

那么是什么让他们的代码更特别呢?

将DataRow转换为强类型DataRow:他们是如何做到的

感谢@Marc Gravell把事情引向了正确的方向:

AnimalDataTable类包含对DataTable未记录的*虚方法的两个重写:

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
    return new AnimalRow(builder);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
protected override global::System.Type GetRowType() {
    return typeof(AnimalRow);
}

* <子>大部分无证