C# 扩展方法与继承

C# 扩展方法与继承,c#,entity-framework,inheritance,extension-methods,C#,Entity Framework,Inheritance,Extension Methods,首先,我有一个DbContext类的扩展方法,可以与日志一起保存: public static int SaveChangesWithLogging(this DbContext context, NLog.Logger logger) { //logging //[...] return context.SaveChanges(); } 然后,我有一个从dbcontext继承的类,我在其中重写了SaveChanges() 我想调用基本DbContext类的SaveC

首先,我有一个DbContext类的扩展方法,可以与日志一起保存:

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

    return context.SaveChanges();
}
然后,我有一个从dbcontext继承的类,我在其中重写了SaveChanges()


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


好的解决方案是什么?

扩展方法隐藏了真正的问题是您试图从外部调用重写的方法,这是不可能的。由于实际对象是
ChildDbContext
,因此被重写的方法将由
SaveChangesWithLogging
调用。无法从
SaveChangesWithLogging
中调用“base”方法,即使您在方法之前或之后强制转换它


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

最后,我为我的dbcontext使用包装器。

我有一个循环和堆栈溢出…”什么?你的回路在哪里?或者你的意思是说你有一个无止境的递归导致了一个
StackOverflowException
?不管怎样,你的问题看起来像XY问题。你为什么要从
SaveChanges
内部调用
SaveChanges
?这似乎是一个破设计。您不应该(也不能)指出在继承链中调用哪个方法,它总是最派生的方法。做一些不同的事情会破坏OOP原则。
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();
    }
}