【问题标题】:Casting a derived class back to base class将派生类转换回基类
【发布时间】:2013-08-08 12:27:24
【问题描述】:

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

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

这在代码中运行良好:我可以创建 ExtendedDatabaseRow 等类型的对象。但是,我想随后将这些对象写回数据库。假设我想将对象changedRowExtendedDatabaseRow 类型)写回数据库:

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# 还是很陌生,尤其是使用的术语,所以如果这是一个愚蠢的问题,请提前道歉。

【问题讨论】:

  • 这是您的原始源代码吗?在 new 和 row 之间有这个空间吗?
  • 也许newrownull?演员阵容与此无关。
  • @oddparity:抱歉,我的错误,已修复:) @Jon:单步执行代码,newrow 确实有价值

标签: c# .net


【解决方案1】:

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

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

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

【讨论】:

  • 完美 - 我学到了一些新东西并解决了问题。谢谢!
【解决方案2】:

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

也就是说,我不明白为什么你会在那里得到一个 Null 引用。您是否通过代码检查过插入时newrow 是否为空?

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 2013-11-17
    • 2021-02-18
    • 2017-07-18
    • 2011-02-04
    • 2012-09-15
    • 2011-06-30
    相关资源
    最近更新 更多