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

时间:2011-11-30 07:52:14

标签: c# casting strongly-typed-dataset auto-generate

我正在尝试制作一些强类型DataRows的轻量级版本,以便为需要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(无法将System.DataRow类型的对象强制转换为类型AnimalRow)。正如我所料。

那么是什么让他们的代码更加特殊?

1 个答案:

答案 0 :(得分:3)

感谢@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);
}

* <子> mostly undocumented