Преобразование DataRow в строго типизированный DataRow: как они это делают? - PullRequest
1 голос
/ 30 ноября 2011

Я пытаюсь сделать облегченную версию некоторых строго типизированных 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 Ответ

3 голосов
/ 30 ноября 2011

Благодарим @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);
}

* в основном без документов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...