C# 动态重写方法组
我有一个实现接口的基类:C# 动态重写方法组,c#,inheritance,C#,Inheritance,我有一个实现接口的基类: internal interface ITest { virtual void GetData(); } internal class Test : ITest { public void GetData() { Console.WriteLine("Test - Hello World!"); } } 它通过继承Test类并重写GetData()方法来使用: internal class SubTest : Test
internal interface ITest
{
virtual void GetData();
}
internal class Test : ITest
{
public void GetData()
{
Console.WriteLine("Test - Hello World!");
}
}
它通过继承Test类并重写GetData()方法来使用:
internal class SubTest : Test
{
public override void GetData()
{
Console.WriteLine("SubTest - Hello World!");
}
}
我有数百个存储过程,每个都需要调用一次。为从Test继承的每个存储过程创建一个新类,如SubTest,似乎有些过分了
有没有一种方法可以编写Lambda表达式、匿名方法或操作,让我重写空的默认方法
我的想法大致如下:
var t = new Test();
t.GetData = delegate()
{
Console.WriteLine("Anonymous - Hello World!");
};
有没有办法像这样动态地为一个方法编写重写
解决了的!
我用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();
}
}
如果您只想分配一些外部函数,那么请重新定义接口,而不是函数,使用操作:
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();
如果您只想分配一些外部函数,那么请重新定义接口,而不是函数,使用操作:
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();
如果我理解正确,你就可以这样做
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");
});
如果我理解正确,你就可以这样做
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");
});
将要执行的存储过程的名称传递给方法
Test
简单是王道
internal interface ITest
{
virtual void GetData(string spname);
}
internal class Test : ITest
{
public void GetData(string spname)
{
Console.WriteLine("Executing store proc: " + spname);
}
}
将要执行的存储过程的名称传递给方法
Test
简单是王道
internal interface ITest
{
virtual void GetData(string spname);
}
internal class Test : ITest
{
public void GetData(string spname)
{
Console.WriteLine("Executing store proc: " + spname);
}
}
鉴于
Test
没有实现,它甚至不应该是类。只要让从它派生的类实现接口。@Servy-为了这个例子,我在上面放了一些简单的东西。这不是我们的完整公司数据库类。我应该添加详细信息吗?@Servy,我编辑了这个问题以显示每个方法的调用位置。你可以让一个类的GetData
方法只执行一个委托,通过公共属性设置(或在ctor中传递)。@jp2code我感觉到了你的痛苦,但是您要做的任何事情都需要对类和接口进行更改。鉴于Test
没有实现,它甚至不应该是类。只要让从它派生的类实现接口。@Servy-为了这个例子,我在上面放了一些简单的东西。这不是我们的完整公司数据库类。我应该添加详细信息吗?@Servy,我编辑了这个问题以显示每个方法的调用位置。你可以让一个类的GetData
方法只执行一个委托,通过公共属性设置(或在ctor中传递)。@jp2code我感觉到了你的痛苦,但是你要做的任何事情都需要对类和接口进行更改。我赢了2秒!XD@Gusman是的:)虽然我们的答案有点不同,所以我还是把我的答案留在这里。{喘息!}这很有效。。。嗯,至少它下面没有红色的曲线。让我测试一下……我赢了2秒!XD@Gusman是的:)虽然我们的答案有点不同,所以我还是把我的答案留在这里。{喘息!}这很有效。。。嗯,至少它下面没有红色的曲线。让我来测试一下……我们假设接口不能改变。我们假设接口不能改变。