C# 创建一个包含要调用的参数的函数列表的简单方法?
我正在寻找一种简单的方法来创建一个包含可以调用的参数的函数列表。我几乎做到了,但在将方法设置为参数时遇到了一些问题。 这是我的代码:C# 创建一个包含要调用的参数的函数列表的简单方法?,c#,list,delegates,action,C#,List,Delegates,Action,我正在寻找一种简单的方法来创建一个包含可以调用的参数的函数列表。我几乎做到了,但在将方法设置为参数时遇到了一些问题。 这是我的代码: public class PlayerInfo { public static PlayerInfo Instance; // singleton public int Energy; public int MaxEnergy; public List<KeyValuePair<DateTime, cronTab>
public class PlayerInfo
{
public static PlayerInfo Instance; // singleton
public int Energy;
public int MaxEnergy;
public List<KeyValuePair<DateTime, cronTab>> cron;
//some update event for instance every frame of game
void Update() {
var keys = cron;
for (int k=0;k<keys.Count;k++) {
if (keys[k].Key.CompareTo(System.DateTime.Now) < 0 )
{
keys[k].Value.function.Invoke(keys[k].Value.parameter);
cron.RemoveAt(k);
}
}
}
public static void addEnergy(DateTime date)
{
if (PlayerInfo.Instance.Energy < PlayerInfo.Instance.MaxEnergy)
PlayerInfo.Instance.Energy++;
date = date.AddSeconds (10);
PlayerInfo.Instance.cron.Add (new KeyValuePair<DateTime, cronTab>(date, new cronTab(){type = CronType.energy, function = (Action<System.Object>)PlayerInfo.addEnergy, parameter = date}));
}
}
public class cronTab
{
public CronType type;
public System.Object parameter;
public Action<System.Object> function;
}
public enum CronType
{
energy,
mail
}
公共类PlayerInfo
{
公共静态PlayerInfo实例;//单例
公共能源;
公共能源;
公共列表cron;
//一些更新事件,例如游戏的每一帧
无效更新(){
var-keys=cron;
for(int k=0;k编译器对您大喊大叫,因为您的方法的签名与委托不兼容。您需要更改
public Action<System.Object> function;
到
然后删除下一行中的显式委托强制转换
PlayerInfo.Instance.cron.Add (new KeyValuePair<DateTime, cronTab>(date, new cronTab(){type = CronType.energy, function = PlayerInfo.addEnergy, parameter = date}));
PlayerInfo.Instance.cron.Add(新的KeyValuePair(日期,新的cronTab(){type=CronType.energy,function=PlayerInfo.addEnergy,parameter=date});
使用以下方法:
function = ((obj) => PlayerInfo.addEnergy((DateTime)obj))
它以前不起作用,因为您的委托
声明它需要一个对象
,但您试图将其设置为(addEnergy
)的函数需要一个日期时间
请注意,System.Object
等同于Object
此外,如果每个cronTab.function
都使用DateTime
,则应将其设置为操作。如果进行此更改,则可以使用原始代码:
function = PlayerInfo.addEnergy
(请注意,此处不需要对Action
进行强制转换,因为PlayerInfo.addEnergy
已经是正确的类型。)当您在此处仅使用委托操作时,一切都会变得更加简单。如果没有跟踪要发送的参数的类,不要尝试处理不同数量或类型的参数。尝试这样做会造成巨大的混乱,必然会移除所有静态类型安全性
而是在创建委托时关闭所需的任何参数,以将方法从原来的任何形式转换为操作
public class CronTab
{
public CronType type;
public Action action;
}
public static void addEnergy(DateTime date)
{
if (PlayerInfo.Instance.Energy < PlayerInfo.Instance.MaxEnergy)
PlayerInfo.Instance.Energy++;
date = date.AddSeconds(10);
PlayerInfo.Instance.cron.Add(
new KeyValuePair<DateTime, CronTab>(
date,
new CronTab()
{
type = CronType.energy,
action = () => PlayerInfo.addEnergy(date),
}));
}
公共类CronTab
{
公共CronType;
公共行动;
}
公共静态无效附加能量(日期时间日期)
{
if(PlayerInfo.Instance.EnergyPlayerInfo.addEnergy(日期),
}));
}
为什么要使类PlayerInfo
非静态
,然后使公共静态PlayerInfo实例
?为什么不只是使PlayerInfo
静态
?因为这只是此函数的单例的一部分。我需要此函数非静态,以便在每个cronTa中正确序列化它b、 函数
获取一个日期时间
?如果是这样,您应该将其改为一个操作
,在这种情况下,仅进行该更改将使您的代码编译。这将丢失所有参数的静态类型,仍然要求方法只有一个(不是更多,也不是更少)参数,这比它需要做的工作多得多。谢谢你,我没有将cronTab.function作为操作,因为我将使用单个列表调用具有不同参数的方法。我使用System.Object,因为在Unity中有类似Unity.Object的东西,它与标准类型冲突。@Servy这不会丢失静态类型,因为一开始没有任何参数。另外,我假设cronTab.function
函数只接受一个参数,因为这是问题中所述的。我不知道你为什么会这样认为。@Jashaszun编写解决方案代码以启用静态类型比执行所有这些操作以禁止它更容易。处理w也是如此使用任何其他数量的参数。支持一般情况比经历所有这些困难而不支持它更容易。最佳解决方案!非常感谢!
function = ((obj) => PlayerInfo.addEnergy((DateTime)obj))
function = PlayerInfo.addEnergy
public class CronTab
{
public CronType type;
public Action action;
}
public static void addEnergy(DateTime date)
{
if (PlayerInfo.Instance.Energy < PlayerInfo.Instance.MaxEnergy)
PlayerInfo.Instance.Energy++;
date = date.AddSeconds(10);
PlayerInfo.Instance.cron.Add(
new KeyValuePair<DateTime, CronTab>(
date,
new CronTab()
{
type = CronType.energy,
action = () => PlayerInfo.addEnergy(date),
}));
}