我有一个实现接口的基类:
internal interface ITest
{
virtual void GetData();
}
internal class Test : ITest
{
public void GetData()
{
Console.WriteLine("Test - Hello World!");
}
}
通过继承测试类并覆盖 GetData()方法来使用它:
internal class SubTest : Test
{
public override void GetData()
{
Console.WriteLine("SubTest - Hello World!");
}
}
我有数百个存储过程,每个都需要调用一次。为继承自测试的每个存储过程创建一个新的类,如 SubTest ,似乎有点过分。
有没有办法写一个Lambda Expression,Anonymous Method或Action,让我覆盖空的默认方法?
我正在思考的是这些方面:
var t = new Test();
t.GetData = delegate()
{
Console.WriteLine("Anonymous - Hello World!");
};
有没有办法像这样编写方法 on-the-fly 的覆盖?
我使用了Evk的技术来应用Gusman所展示的内容:
internal interface ITest
{
virtual void GetData();
}
internal class Test : ITest
{
public void GetData()
{
Console.WriteLine("Call from Test");
}
}
internal class SubTest : Test
{
private readonly Action _localTest;
public SubTest(Action localTest)
{
_localTest = localTest;
}
public override void GetData()
{
base.GetData();
_localTest();
}
}
以下是我实施它的方式:
class ClassTester
{
public void Run()
{
var t = new Test(() =>
{
Console.WriteLine("Anonymous Override of Test");
}
);
t.GetData();
}
}
答案 0 :(得分:3)
如果我理解你就可以做到
class DynamicTest : Test {
private readonly Action _getData;
public DynamicTest(Action getData) {
_getData = getData;
}
public override void GetData() {
_getData();
}
}
然后
var test = new DynamicTest(() => {
Console.WriteLine("Dynamic");
});
答案 1 :(得分:1)
好吧,如果你只想分配一些外部函数,那么重新定义你的界面,而不是一个函数使用一个Action:
internal interface ITest
{
Action GetData{ get; set; }
}
internal class Test : ITest
{
public Action GetData { get; set; }
}
然后你可以做你想做的事:
var t = new Test();
t.GetData = () =>
{
Console.WriteLine("Anonymous - Hello World!");
};
您可以将其称为
t.GetData();
答案 2 :(得分:1)
将要执行的存储过程的名称传递给方法Test
。
朴素是国王。
internal interface ITest
{
virtual void GetData(string spname);
}
internal class Test : ITest
{
public void GetData(string spname)
{
Console.WriteLine("Executing store proc: " + spname);
}
}