2 回答
TA贡献1786条经验 获得超11个赞
简答
c# - 如何制作指向另一个动作的动作?
你不能。动作是委托,委托是不可变的。
应该指向我想听的动作的动作似乎实际上并没有指向它。
那是因为delegates是不可变的。即使您传递了一个ref委托,当您执行分配时,您也会创建一个副本。代表strings就是这样。
public WaitForActionProcess(ref Action action)
{
// assignment creates a copy of a delegate
actionHandler = action;
}
例子
这是为您准备的小提琴,可以进一步演示。
public class Program
{
static Action action1;
static Action actionHandler;
public static void Main()
{
WaitForActionProcess(ref action1);
}
public static void WaitForActionProcess(ref Action action)
{
// this is still a reference to action1
action += Both;
// assignment creates a copy of a delegate
actionHandler = action;
// action is still a reference to action1
// but actionHandler is a *copy* of action1
action += OnlyAction1;
actionHandler += OnlyActionHandler;
action();
// Both
// OnlyAction1
actionHandler();
// Both
// OnlyAction2
}
public static void Both()=> Console.WriteLine("Both");
public static void OnlyAction1() => Console.WriteLine("OnlyAction1");
public static void OnlyActionHandler() => Console.WriteLine("OnlyActionHandler");
}
可能的解决方法
使用 aList<Action>代替。这是一个 Fiddle。
using System;
using System.Collections.Generic;
public class Program
{
static List<Action> action1 = new List<Action>();
static List<Action> actionHandler;
public static void Main()
{
WaitForActionProcess(action1);
}
public static void WaitForActionProcess(List<Action> action)
{
action.Add(Both);
// assignment passes a reference to the List
actionHandler = action;
action.Add(OnlyAction1);
actionHandler.Add(OnlyActionHandler);
// now things work nicely
foreach(var a in action) a();
foreach(var a in actionHandler) a();
}
public static void Both()=> Console.WriteLine("Both");
public static void OnlyAction1() => Console.WriteLine("OnlyAction1");
public static void OnlyActionHandler() => Console.WriteLine("OnlyActionHandler");
}
- 2 回答
- 0 关注
- 145 浏览
添加回答
举报