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是的:)虽然我们的答案有点不同,所以我还是把我的答案留在这里。{喘息!}这很有效。。。嗯,至少它下面没有红色的曲线。让我来测试一下……我们假设接口不能改变。我们假设接口不能改变。