另一个类中的动作委托引用?

我正在寻找一种方法来允许另一个类通过调用该类的方法向我的 Action 委托添加方法,而不是在第一个类上调用 Action。


这就是我需要的:


class Program

{

    static void Main(string[] args)

    {

        Action Execute = delegate { };


        ProgramTest prog = new ProgramTest(ref Execute);


        prog.AddMethod();


        Execute();

    }

}


class ProgramTest

{

    public Action execute;


    public ProgramTest(ref Action action)

    {

        execute = action;

    }


    public void AddMethod()

    {

        execute += Print;

    }


    public void Print()

    {

        Console.WriteLine("test");

        Console.ReadLine();

    }

}

但是,当我调用 Execute() 时,什么也没有发生。


我怎样才能让它工作?


潇潇雨雨
浏览 67回答 4
4回答

慕容3067478

另一种选择是将(不可变的)委托放在可变容器中。public class ActionContainer{    public Action Action { get; set; } = () => { };}class Program{    static void Main(string[] args)    {        ActionContainer execute = new ActionContainer();        ProgramTest prog = new ProgramTest(execute);        prog.AddMethod();        execute.Action();    }}class ProgramTest{    public ActionContainer execute;    public ProgramTest(ActionContainer action)    {        execute = action;    }    public void AddMethod()    {        execute.Action += Print;    }    public void Print()    {        Console.WriteLine("test");        Console.ReadLine();    }}

精慕HU

你想要的是这样的:class Program{&nbsp; &nbsp; static void Main(string[] args)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Action Execute = delegate { };&nbsp; &nbsp; &nbsp; &nbsp; ProgramTest prog = new ProgramTest(h => Execute += h);&nbsp; &nbsp; &nbsp; &nbsp; prog.AddMethod();&nbsp; &nbsp; &nbsp; &nbsp; Execute();&nbsp; &nbsp; }}class ProgramTest{&nbsp; &nbsp; public Action<Action> execute;&nbsp; &nbsp; public ProgramTest(Action<Action> action)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; execute = action;&nbsp; &nbsp; }&nbsp; &nbsp; public void AddMethod()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; execute(Print);&nbsp; &nbsp; }&nbsp; &nbsp; public void Print()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("test");&nbsp; &nbsp; &nbsp; &nbsp; Console.ReadLine();&nbsp; &nbsp; }}打印test到控制台。这是这个模式的一个稍微好一点的版本:class Program{&nbsp; &nbsp; static void Main(string[] args)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Action Execute = delegate { };&nbsp; &nbsp; &nbsp; &nbsp; ProgramTest prog = new ProgramTest(h => Execute += h, h => Execute -= h);&nbsp; &nbsp; &nbsp; &nbsp; var subscription = prog.AddMethod();&nbsp; &nbsp; &nbsp; &nbsp; Execute();&nbsp; &nbsp; &nbsp; &nbsp; subscription.Dispose();&nbsp; &nbsp; }}class ProgramTest{&nbsp; &nbsp; public Action<Action> _attach;&nbsp; &nbsp; public Action<Action> _detach;&nbsp; &nbsp; public ProgramTest(Action<Action> attach, Action<Action> detach)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; _attach = attach;&nbsp; &nbsp; &nbsp; &nbsp; _detach = detach;&nbsp; &nbsp; }&nbsp; &nbsp; public IDisposable AddMethod()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; _attach(Print);&nbsp; &nbsp; &nbsp; &nbsp; return Disposable.Create(() => _detach(Print));&nbsp; &nbsp; }&nbsp; &nbsp; public void Print()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("test");&nbsp; &nbsp; &nbsp; &nbsp; Console.ReadLine();&nbsp; &nbsp; }}public sealed class Disposable : IDisposable{&nbsp; &nbsp; public static IDisposable Create(Action action)&nbsp; &nbsp; &nbsp; &nbsp; => new Disposable(action);&nbsp; &nbsp; private readonly Action _action;&nbsp; &nbsp; private int _disposed;&nbsp; &nbsp; private Disposable(Action action)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; _action = action;&nbsp; &nbsp; }&nbsp; &nbsp; public void Dispose()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (Interlocked.Exchange(ref _disposed, 1) == 0)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _action();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}我什至会更进一步并定义一个MetaAction- 您可以随意传递它并向其添加方法。class Program{&nbsp; &nbsp; static void Main(string[] args)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Action Execute = delegate { };&nbsp; &nbsp; &nbsp; &nbsp; MetaAction meta = MetaAction.Create(h => Execute += h, h => Execute -= h);&nbsp; &nbsp; &nbsp; &nbsp; var prog = new ProgramTest(meta);&nbsp; &nbsp; &nbsp; &nbsp; var subscription = prog.AddMethod();&nbsp; &nbsp; &nbsp; &nbsp; Execute();&nbsp; &nbsp; &nbsp; &nbsp; subscription.Dispose();&nbsp; &nbsp; }}public class MetaAction{&nbsp; &nbsp; public static MetaAction Create(Action<Action> attach, Action<Action> detach)&nbsp; &nbsp; &nbsp; &nbsp; => new MetaAction(attach, detach);&nbsp; &nbsp; public Action<Action> _attach;&nbsp; &nbsp; public Action<Action> _detach;&nbsp; &nbsp; private MetaAction(Action<Action> attach, Action<Action> detach)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; _attach = attach;&nbsp; &nbsp; &nbsp; &nbsp; _detach = detach;&nbsp; &nbsp; }&nbsp; &nbsp; public IDisposable Subscribe(Action action)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; _attach(action);&nbsp; &nbsp; &nbsp; &nbsp; return Disposable.Create(() => _detach(action));&nbsp; &nbsp; }}public class ProgramTest{&nbsp; &nbsp; public MetaAction _meta;&nbsp; &nbsp; public ProgramTest(MetaAction meta)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; _meta = meta;&nbsp; &nbsp; }&nbsp; &nbsp; public IDisposable AddMethod()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return _meta.Subscribe(Print);&nbsp; &nbsp; }&nbsp; &nbsp; public void Print()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("test");&nbsp; &nbsp; &nbsp; &nbsp; Console.ReadLine();&nbsp; &nbsp; }}public sealed class Disposable : IDisposable{&nbsp; &nbsp; public static IDisposable Create(Action action)&nbsp; &nbsp; &nbsp; &nbsp; => new Disposable(action);&nbsp; &nbsp; private readonly Action _action;&nbsp; &nbsp; private int _disposed;&nbsp; &nbsp; private Disposable(Action action)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; _action = action;&nbsp; &nbsp; }&nbsp; &nbsp; public void Dispose()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (Interlocked.Exchange(ref _disposed, 1) == 0)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _action();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}

慕标5832272

您可以通过调用 prog.Execute 而不是 Execute 来使其工作,就像下面的代码一样。class Program{&nbsp; &nbsp; static void Main(string[] args)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Action Execute = delegate { };&nbsp; &nbsp; &nbsp; &nbsp; ProgramTest prog = new ProgramTest(ref Execute);&nbsp; &nbsp; &nbsp; &nbsp; prog.AddMethod();&nbsp; &nbsp; &nbsp; &nbsp; prog.execute();&nbsp; &nbsp; }}或者您需要将 Print 方法分配给 main 方法执行委托,如下所示class Program{&nbsp; &nbsp; static void Main(string[] args)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Action Execute = delegate { };&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ProgramTest prog = new ProgramTest(ref Execute);&nbsp; &nbsp; &nbsp; &nbsp; Execute += prog.Print;&nbsp; &nbsp; &nbsp; &nbsp; prog.AddMethod();&nbsp; &nbsp; &nbsp; &nbsp; Execute();&nbsp; &nbsp; }}

qq_花开花谢_0

您Program可能会公开一个事件,您的其他类可能会向该事件注册另一个处理程序:class Program{&nbsp; &nbsp; public static event Action MyEvent;&nbsp; &nbsp; static void Main(string[] args)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; ProgramTest prog = new ProgramTest();&nbsp; &nbsp; &nbsp; &nbsp; prog.AddMethod();&nbsp; &nbsp; &nbsp; &nbsp; // raise the event and invoke the registered handlers&nbsp; &nbsp; &nbsp; &nbsp; MyEvent?.Invoke();&nbsp; &nbsp; }}class ProgramTest{&nbsp; &nbsp; private Action handler;&nbsp; &nbsp; public ProgramTest()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; handler = Print;&nbsp; &nbsp; }&nbsp; &nbsp; public void AddMethod()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Program.MyEvent += handler;&nbsp; // regsiter the execute-delegate to the event&nbsp; &nbsp; &nbsp; &nbsp; // or directly: Program.MyEvent += Print;&nbsp; &nbsp; }&nbsp; &nbsp; public void Print()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("test");&nbsp; &nbsp; &nbsp; &nbsp; Console.ReadLine();&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP