在重写抽象方法并尝试调用我当前正在重写的基类方法时,我看到了一个非常奇怪的问题。
//In Dll "A"
namespace Rhino.Etl.Core.Operations
{
using System;
using System.Collections;
using System.Collections.Generic;
public class Row {}
public interface IOperation
{
IEnumerable<Row> Execute(IEnumerable<Row> rows);
}
public abstract class AbstractOperation : IOperation
{
public abstract IEnumerable<Row> Execute(IEnumerable<Row> rows);
}
public abstract class AbstractDatabaseOperation : AbstractOperation
{
}
public abstract class SqlBulkInsertOperation : AbstractDatabaseOperation
{
public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
{
Console.WriteLine("SqlBulkInsertOperation");
return rows;
}
}
}
//In console app "B"
namespace MyStuff
{
using System;
using System.Collections;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
ActualEtlOperation e = new ActualEtlOperation();
e.Execute(new Row[0]);
Console.ReadLine();
}
}
public abstract class SqlBulkInsertWithTruncateOperation : SqlBulkInsertOperation
{
public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
{
Console.WriteLine("Truncate");
base.Execute(rows);
return rows;
}
}
public class ActualEtlOperation : SqlBulkInsertWithTruncateOperation
{
}
}
基本上,SqlBulkInsertOperation 没有做我需要做的事情,所以我需要在通过覆盖它调用 Execute(rows) 之前和之后做一些工作。但是 SqlBulkInsertOperation.Execute(Rows) 中的代码没有被执行。
在 Visual Studio 的调试器中运行此代码时,调试器不会执行该代码。当我将鼠标悬停在 Visual Studio 编辑器中的“base”上时,它知道基类的类型是 SqlBulkInsertOperation。
我错过了什么?