我正在构建一个统计系统。在这个系统中,有某些统计是依靠其他统计来计算其最终值的。这是我最初的尝试。
public class ModdedStat
{
public delegate float Mod();
public Mod mod;
public float baseStat;
public float finalStat
{
get
{
return baseStat + mod();
}
}
}
不幸的是,这是返回baseStat +最后一个订阅model的监听器。我对此进行了如下测试。
stat.baseStat = 0;
stat.mod += Out1;
stat.mod += Out2;
Console.Write(stat.finalStat);
Out1和Out2是分别返回1和2的函数. 控制台写返回的是'2'。
我以前从来没有使用过返回类型的委托,所以不知道我的逻辑有什么问题。有没有类似的解决方案,甚至完全不同的变通方法?
谢谢你的帮助!我正在构建一个统计系统。
发生这种情况是因为默认情况下,调用多播会运行所有你使用添加的委托人的 +=
,但返回的值将是你最后添加的那个值。毕竟,一次调用只能返回一个值。
如果你想要输出 3
,您可以使用 GetInvocationList
来获取您使用 +=
到多播委托。然后,你可以在数组中循环,将返回值加起来。
public float finalStat
{
get
{
float totalMod = 0;
foreach(Mod m in mod.GetInvocationList()) {
totalMod += m();
}
return baseStat + totalMod;
}
}
除了使用 delegate
与 GetInvocationList
在这种情况下,将是 Func
:
var funcs = new List<Func<int>>();
funcs.Add(Out1);
funcs.Add(Out2);
funcs.Sum(f => f());
或者用你的课。
public class ModdedStat
{
readonly List<Func<int>> funcs = new List<Func<int>>();
public void AddFunc(Func<int>)
{
funcs.Add(func);
}
public float baseStat;
public float finalStat => baseStat + funcs.Sum(f => f());
}
那么..:
stat.baseStat = 0;
stat.AddFunc(Out1);
stat.AddFunc(Out2);
Console.Write(stat.finalStat);