扩展方法和继承

时间:2016-11-03 08:36:29

标签: c# entity-framework inheritance extension-methods

首先,我有一个DbContext类的扩展方法,用日志保存:

public static int SaveChangesWithLogging(this DbContext context, NLog.Logger logger)
{
    //logging
    //[...]

    return context.SaveChanges();
}

然后,我有一个继承自dbcontext的类,我覆盖了SaveChanges()

public class ChildDbContext : DbContext
{
    public override int SaveChanges()
    {
        //other stuff
        //[...]

        //doesn't work, no definition for SaveChangesWithLogging (extension method not found, why ?)
        return base.SaveChangesWithLogging();


        //doesn't work, loop on SaveChanges by extension method and stack overflow as a result
        return base.SaveChangesWithLogging();
    }
}

我想调用基本DbContext类的SaveChanges(),但它调用ChildDbContext的SaveChanges()或者我有一个循环和堆栈溢出...

什么是好的解决方案?

2 个答案:

答案 0 :(得分:1)

扩展方法隐藏真正的问题是你试图从外部调用重写方法,这是不可能的。由于实际对象是Button{ ... width: myTextField.width } ,因此被覆盖的方法将由ChildDbContext调用。没有办法从SaveChangesWithLogging内调用“基础”方法 - 即使你在方法之前投射它也是如此。

我建议重新安排你的调用层次结构,以便可以从派生方法调用基本方法,或者使用非虚方法,以便可以直接调用基本方法。

答案 1 :(得分:0)

最后,我为dbcontext使用了一个包装器。