如何link两个不同的代表类?

How to link two delegates in different classes?

我有两个不同的 类,比如 OuterInnerInner 的一个实例是 Outer 中的一个字段。我的目标是 link ActionInnerActionOuter;换句话说,当我为 ActionOuter 添加操作时,我希望它被添加到 ActionInner。我该怎么做?

我的尝试无效,因为这两个操作都是空的:

    class Program
    {
        static void Main()
        {
            Outer outer = new Outer();

            void writeToConsole(double foo)
            {
                Console.WriteLine(foo);
            }

            // Here I expect to link the 'writeToConsole' action to 'inner' 'ActionInner'
            outer.ActionOuter += writeToConsole;

            // Here I expect an instance of 'inner' to output '12.34' in console
            outer.StartAction();

            Console.ReadKey();
        }
    }

    class Inner
    {
        public Action<double> ActionInner;

        public void DoSomeStuff(double foo)
        {
            ActionInner?.Invoke(foo);
        }
    }

    class Outer
    {
        readonly Inner inner;

        public Action<double> ActionOuter;

        public void StartAction()
        {
            inner.DoSomeStuff(12.34);
        }

        public Outer()
        {
            inner = new Inner();

            // Here I want to somehow make a link between two actions
            inner.ActionInner += ActionOuter;
        }
    }

考虑为您的 class 使用 Properties。使用属性可以让您在 属性 被检索或设置新值时发生某些事情。

例如,如果我们为 ActionOuter 实现一个 属性,我们可以在每次设置 ActionOuter 时检查我们是否有一个 inner 并可能设置很值。

当您使用 setter(set accessor)(如下所示)时,您可以使用特殊关键字 value,它表示在将 ActionOuter 分配给 last 时传递的值。这是您将用来设置私有 actionOuter 的值,如果需要,也可能是 inner.ActionInner

private Action<double> actionOuter;
public Action<double> ActionOuter{
    get => actionOuter;
    set{
        // do something here, maybe set inner's value?
        actionOuter = value;
    }
}

ActionOuter 字段更改为 属性。像下面这样设置和获取;

public Action<double> ActionOuter
    {
        set => inner.ActionInner = value;
        get => inner.ActionInner;
    }