将派生类转换回基类

时间:2013-08-08 12:27:24

标签: c# .net

我有一些使用LINQ-to-SQL类的简单(C#,。Net 4.0)代码,我正在尝试“扩展”该对象以添加我自己的字段。假设LINQ生成的类名为DatabaseRow,我想添加几个bool值供内部使用:

public class ExtendedDatabaseRow: DatabaseRow
{
   public bool ReadyToWrite;
   public bool Changed;
}

这在代码中工作正常:我可以创建类型为ExtendedDatabaseRow的对象等。但是,我想将这些对象写回数据库。假设我想将对象changedRow(类型为ExtendedDatabaseRow)写回数据库:

DataClassesDataContext dc = new DataClassesDataContext();
DatabaseRow newrow = (DatabaseRow) changedRow; // "Cast" the extended object back to the base type
dc.DatabaseRows.InsertOnSubmit(newrow);
dc.SubmitChanges();

这会引发错误

  

对象引用未设置为对象的实例。

尝试InsertOnSubmit

我可以创建一个新的DatabaseRow对象并从源对象复制每个参数,但这对我来说似乎有些混乱。我可以简单地将扩展对象强制转换回基础对象,如果是这样,我做错了什么?或者我正在做的很好,错误是更具LINQ特定的东西?

我对C#还是很陌生,特别是使用的术语,如果这是一个愚蠢的问题,请提前道歉。

2 个答案:

答案 0 :(得分:6)

您不需要派生新类来扩展Linq To Sql实体,出于这个原因,类被标记为partial,例如。

public partial class DatabaseRow
{
    public bool ReadyToWrite { get; set; }
    public bool Changed { get; set; }
}

这是扩展设计器生成的数据库实体的recommended方式,意味着您不必进行强制转换。

答案 1 :(得分:1)

IIRC,LINQ-to-SQL创建了部分类,因此您可以通过这种方式扩展它;这可能是扩展LINQ-to-SQL类的默认方式。

那就是说,我不明白为什么你会在那里得到Null参考。您是否已逐步完成代码以检查插入时newrow是否为空?