部分方法和非部分类的继承

时间:2014-08-01 16:27:24

标签: c# .net linq-to-sql

我使用设计器从数据库导入了一个表,然后我编辑了相应的cs文件,为模型添加了额外的功能(因为这个原因,它是部分的)。现在我提出了一些关于如何使该功能更可重用并将其打包到基类中的想法(所以在上下文代码中我有partial class Foo : BaseClass)。我让部分类继承了基类,一切都很好......除了部分方法。

生成的部分类有一些部分方法,通常没有任何代码(即OnCreated方法)。我已经在基类中添加了OnCreated方法并在其中添加了一个断点,但它从未被击中。

我可以以某种方式使某个部分类从非部分父级获取部分方法的代码,或者我在这里做错了吗?

背景:我有一个特定的结构(包含作者ID的列,用户的id是修改记录的最后一个用户,以及创建和更新日期的日期)在多个表中,我试图定义大多数代码,以便在我的项目中的单个位置处理它。它涉及对相关用户的统一访问,我通过在我的基类中定义关联(基本上是this,但几乎没有修改)有幸运行。到目前为止它似乎完美无缺,除了我应该为生成的类的构造函数内的存储变量分配默认值这一事实 (this._SomeVariable = default(EntityRef<SomeModel>))。但是,修改生成的代码是没有意义的,因为重新生成文件时所有更改都将丢失。因此,下一个最好的方法是实现在生成的类的末尾运行的OnCreated部分方法。我可以在我的模型的非生成cs文件中实现它,但我宁愿将它放在与所有类似模型共享的基类中。

以下是一些最简单的代码,以使其更加清晰:

生成的代码:

partial class Foo
{
    public Foo()
    {
        // does some initialization here
        this.OnCreated();
    }

    partial void OnCreated();
}

Foo的扩展代码:

partial class Foo : BaseClass // Thanks to this I can use the uniform JustSomeModel association
{
    // This code here would run if it was uncommented
    // partial void OnCreated() {}

    // However I'd rather just have the code from base.OnCreated()
    // run without explicitly calling it
}

基类:

public class BaseClass
{
    protected EntityRef<SomeModel> _SomeVariable;

    [Association(Name = "FK_SomeModel", Storage = "_SomeVariable", ThisKey = "SomeModelId", OtherKey = "Id", IsForeignKey = true)]
    public SomeMode JustSomeModel
    {
        get
        {
            return this._SomeVariable.Entity;
        }
    }

    // This never runs
    public void OnCreated()
    {
        this._SomeVariable = default(EntityRef<SomeModel>)
    }
}

我现在能想到的最佳解决方案是:

partial class Foo : BaseClass
{
    partial void OnCreated()
    {
        base.OnCreated(); // Haven't really tested this yet
    }
}

然而,这意味着我必须将这段代码添加到我使用的BaseClass继承的每个模型中,而我宁愿避免使用它。

1 个答案:

答案 0 :(得分:1)

基于Eugene Podskal发布的信息,我可以假设这不能做到,我最好的办法是实现部分方法并在其中调用基本方法。

partial class Foo : BaseClass
{
    partial void OnCreated()
    {
        base.OnCreated();
    }
}

编辑:测试它并且它可以工作。