如何在替代方法中使用基本方法的局部功能

时间:2018-08-16 21:20:21

标签: c# inheritance scope c#-7.0 local-functions

如果我有此代码:

public virtual void Foo()
{
    void Bar()
    {
        // do important stuff for Foo
    }
}

// In a child class: 
public override void Foo()
{
    Bar();        // Doesn't work
    base.Bar();   // Also doesn't work
}

是否有必要在Bar内调用Foo内的Bar中定义的局部函数?

2 个答案:

答案 0 :(得分:4)

  

在没有使Bar成为常规方法的情况下,有没有办法调用Bar在Foo中定义的局部函数?

没有按设计的方式。 这就是“本地”的含义。只能通过声明中位置中的代码通过名称来访问 local ;这就是为什么他们被称为“本地人”。

有“任何”方式吗?当然,您可以使用反射和反编译以及不安全的代码等等来处理各种恶作剧。请不要这些是编译器的实现细节;不要尝试对它们进行反向工程,当然也不要依赖于编译器团队永久采用的任何实现选择!

答案 1 :(得分:-1)

是的,您可以像使用任何lambda表达式一样向其传递委托。不,这不会破坏任何“规则”,我们一直在Javascript中,在模块模式下或以任何方式调用它。

public class MyBase
{
    protected Action Foo()
    {
        return Local;

        void Local()
        {
            Console.WriteLine("Hello world");
        }
    }
}

public class MyDerived : MyBase
{
    public void HelloWorld()
    {
        var f = Foo();
        f();
    }
}


public class Program
{
    public static void Main()
    {
        var o = new MyDerived();
        o.HelloWorld();
    }
}

输出:

Hello world

Link to DotNetFiddle